Скажите возможно ли загрузить фото для просмотра не занося его при этом в поле таблицы? Т.е. подгрузить в окно, посмотреть и при закрытии окна, фотография не сохраняется в базе.
Если такого способа нет, можно ли в деталь Файлы заносить ссылку на фотографию, но не вручную, а при добавлении записи в таблицу?
Нравится
В продолжение темы http://www.community.terrasoft.ru/forum/topic/7194
Предлагаю добавить ссылку на фотографию в деталь файлы, это можно сделать, к примеру на обработчик нажатия Ок в карточке контакта, для этого подключаем scr_FileUtils к скрипт scr_ContactEdit
В самом начале обработчика btnOKOnClick объявим
[javascript]
var ContactID = dlData.Dataset('ID');
var ContactName = dlData.Dataset('Name');
[/javascript]
Далее после scr_BaseDBEdit.btnOKOnClick(Control); добавим код :
[javascript]
//Link Photo
var FilesDataset = Services.GetNewItemByUSI('ds_Files');
var ft_Link = '{94A8A85B-7EAF-405C-900A-58DC0301EDC2}'; //enm_FileTypes
var Revision = 1;
var ShortFileName = 'C:\\' + ContactName + '.jpg';
var ObjectType= ft_Link;
if (CheckFileExists(ShortFileName)){
var FileID = Connector.GenGUID();
try {
FilesDataset.Append();
FilesDataset.Values('ID') = FileID;
FilesDataset.Values('ItemTypeID') = ObjectType;
FilesDataset.Values('Link') = ShortFileName;
FilesDataset.Values('Revision') = Revision;
var FilePosted = FilesDataset.Post();
} finally {
FilesDataset.Close();
}
if (FilePosted) {
var InsertQuery = Services.GetNewItemByUSI('iq_FileInContact');
var ColumnsValues = InsertQuery.ColumnsValues;
ColumnsValues.ItemsByName('FileID').Value = FileID;
ColumnsValues.ItemsByName('ContactID').Value = ContactID;
var ID = Connector.GenGUID();
ColumnsValues.ItemsByName('ID').Value = ID;
InsertQuery.Execute();
}
}
//end
[/javascript]
CheckFileExists - делает проверку на существование файла, если файла не существует ничего не делаем.
var ShortFileName = 'C:\\' + ContactName + '.jpg'; - формируем путь к файлу, название файла должно быть ФИО контакта, можете сделать варианты
а если не на ОК карточки редактирования (в разделе ее нету), а, например, на кнопку в разделе

как определить к какому контакту прикреплять файл?
Получить ID текущего выбранного контакта можно следующим образом
var ContactID = GetDatasetFieldValue(Dataset, 'ID');
[javascript]
function addPhotoOnClick(Control) {
var Dataset = dlData.Dataset;
var ContactID = GetDatasetFieldValue(Dataset, 'ID'); //текущее значение датасета
var ContactName = Dataset('Name');
//Link Photo
var FilesDataset = Services.GetNewItemByUSI('ds_Files');
var ft_Link = '{94A8A85B-7EAF-405C-900A-58DC0301EDC2}'; //enm_FileTypes
var Revision = 1;
var ShortFileName = 'C:\\' + ContactName + '.jpg';
var ObjectType= ft_Link;
if (CheckFileExists(ShortFileName)){
var FileID = Connector.GenGUID();
try {
FilesDataset.Append();
FilesDataset.Values('ID') = FileID;
FilesDataset.Values('ItemTypeID') = ObjectType;
FilesDataset.Values('Link') = ShortFileName;
FilesDataset.Values('Revision') = Revision;
var FilePosted = FilesDataset.Post();
} finally {
FilesDataset.Close();
}
if (FilePosted) {
var InsertQuery = Services.GetNewItemByUSI('iq_FileInContact');
var ColumnsValues = InsertQuery.ColumnsValues;
ColumnsValues.ItemsByName('FileID').Value = FileID;
ColumnsValues.ItemsByName('ContactID').Value = ContactID;
var ID = Connector.GenGUID();
ColumnsValues.ItemsByName('ID').Value = ID;
InsertQuery.Execute();
}
}
//end
}
[/javascript]
Вообще заносить ссылку на фото в деталь Файл получилось! Большое спасибо! Но есть нюансы. Если я ставлю
[javascript]
var ContactID = GetDatasetFieldValue(Dataset, 'ID'); //текущее значение датасета
var ContactName = Dataset('Name');
[/javascript]
ссылка заносится в деталь раздела Контакты, а надо в раздел Посещения
Если ставлю
[javascript]
var ContactID = GetDatasetFieldValue(Dataset, 'AttendanceJobID');
[/javascript]
Не заносится вообще никуда. мне кажеться проблема заключается в том, что таблица AttendanceJob постоянно перезаписывается с помощью Job http://www.community.terrasoft.ru/forum/topic/6843
Как сделать так чтобы ссылки отображались в нужном разделе?
Так происходит потому, что при определении в моем примере
var Dataset = dlData.Dataset; являтеся ds_Contact, если у вас есть созданный раздел с деталью файлы, то dlData у вас скорее всего ds_Attendance (ваш датасет), ссылка добавляется именно в контакты, так как используется iq_FileInContact, вам же надо создать по аналогии собственный InsertQuery "iq_FileInAttendance" и заносить ссылку на файлы с привязкой на свой раздел
а при постоянной перезаписи табл посещения, ID записей не меняется? т.е. я iq_FileInAttendance привяжу к ID Attendance, но мне выдает ошибку Invalid column ID. Так как в SelectQuery у меня стоит по таблице контактов, попробовала привязать в ID контактов, ошибки нет, но при этом ничего не происходит, ссылки не генерятся
Таблица tbl_FileInAttendance
[sql]
CREATE TABLE [dbo].[tbl_FileInAttendanceJob] (
[ID] UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL CONSTRAINT [PFileInAttendanceJobID] PRIMARY KEY NONCLUSTERED CONSTRAINT [PDFFileInAttendanceJobID] DEFAULT NEWID(),
[CreatedOn] DATETIME NULL,
[CreatedByID] UNIQUEIDENTIFIER NULL,
[ModifiedOn] DATETIME NULL,
[ModifiedByID] UNIQUEIDENTIFIER NULL,
[FileID] UNIQUEIDENTIFIER NULL,
[ContactID] UNIQUEIDENTIFIER NULL
);
CREATE INDEX [IFileInAttendanceJobCreatedBy] ON [dbo].[tbl_FileInAttendanceJob] ([CreatedByID] ASC);
CREATE INDEX [IFileInAttendanceJobModifiedB] ON [dbo].[tbl_FileInAttendanceJob] ([ModifiedByID] ASC);
CREATE INDEX [IFileInAttendanceJobContactID] ON [dbo].[tbl_FileInAttendanceJob] ([ContactID] ASC);
CREATE INDEX [IFileInAttendanceJobFileID] ON [dbo].[tbl_FileInAttendanceJob] ([FileID] ASC);
ALTER TABLE [dbo].[tbl_FileInAttendanceJob] ADD CONSTRAINT [FFileInAttendanceJobContactI1]
FOREIGN KEY ([ContactID]) REFERENCES [dbo].[tbl_Contact] ([ID]);
ALTER TABLE [dbo].[tbl_FileInAttendanceJob] ADD CONSTRAINT [FFileInAttendanceJobFileID1]
FOREIGN KEY ([FileID]) REFERENCES [dbo].[tbl_Files] ([ID]);
[/sql]
iq_FileInAttendance :
[sql]
INSERT INTO [dbo].[tbl_FileInAttendanceJob] ([ID], [FileID], [ContactID])
VALUES (:ID, :FileID, :ContactID)
[/sql]
Елена, если у вас создан раздел Посещения, то к записи каждой записи есть соотвествие с деталью Файлы, насколько я понимаю вашу задачу, то фотография у вас прикрепляется как раз к контакту (Сотруднику), почему бы не решить задачу немного иначе, добавить новую деталь, по переходу в которую подгружалась бы фотография, согласно логике, примерно такой вариант я предлагал вам http://www.community.terrasoft.ru/forum/topic/7194#comment-31015, с модификацией как в этой теме
Полностью подгружать фото в базу не очень удобно, так как фотографий очень много! и размер базы будет очень быстро рости. Поэтому лучше сохранять просто ссылки на файлы.
Дело в том, что если перейти на MS SQL 2008R2 то там можно использовать функцию внешнего зранения файлов, т.е. для системы и для пользователей это заметно не будет и все будут работать в шататном режиме, а на стороне сервера фотографии будут лежать в отдельной директории. Технология называется FileStream. На комьюнити это уже обсуждалось.
Дело в том, что если хранить ссылку на файл, то тут есть несмколько минусов
1. Это практически любой пользователь может иметь доступ ко всем файлам на шаре
2. Если нужна функция добавления/изменения для пользователя - то он может что-то повредить. :)
В сожалению, переход на другую СУБД пока что не возможен(
В том варианте как есть сейчас, на сколько я понял, в разделе Посещения, вы хотите отображать деталm [Файлы] раздела Контакты, возможно допустимым вариантом будет отображать именно деталь [Файлы] с Контактов в разделе Посещения, т.е подменить отображения этой детали, без возможности добавления файлов с этого раздела (для того что бы не нарушать логику деталей)