Скажите возможно ли загрузить фото для просмотра не занося его при этом в поле таблицы? Т.е. подгрузить в окно, посмотреть и при закрытии окна, фотография не сохраняется в базе.
Если такого способа нет, можно ли в деталь Файлы заносить ссылку на фотографию, но не вручную, а при добавлении записи в таблицу?
Нравится
В продолжение темы http://www.community.terrasoft.ru/forum/topic/7194
Предлагаю добавить ссылку на фотографию в деталь файлы, это можно сделать, к примеру на обработчик нажатия Ок в карточке контакта, для этого подключаем scr_FileUtils к скрипт scr_ContactEdit
В самом начале обработчика btnOKOnClick объявим
var ContactID = dlData.Dataset('ID'); var ContactName = dlData.Dataset('Name');
Далее после scr_BaseDBEdit.btnOKOnClick(Control); добавим код :
//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
CheckFileExists - делает проверку на существование файла, если файла не существует ничего не делаем.
var ShortFileName = 'C:\\' + ContactName + '.jpg'; - формируем путь к файлу, название файла должно быть ФИО контакта, можете сделать варианты
а если не на ОК карточки редактирования (в разделе ее нету), а, например, на кнопку в разделе
как определить к какому контакту прикреплять файл?
Получить ID текущего выбранного контакта можно следующим образом
var ContactID = GetDatasetFieldValue(Dataset, 'ID');
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 }
Вообще заносить ссылку на фото в деталь Файл получилось! Большое спасибо! Но есть нюансы. Если я ставлю
var ContactID = GetDatasetFieldValue(Dataset, 'ID'); //текущее значение датасета var ContactName = Dataset('Name');
ссылка заносится в деталь раздела Контакты, а надо в раздел Посещения
Если ставлю
var ContactID = GetDatasetFieldValue(Dataset, 'AttendanceJobID');
Не заносится вообще никуда. мне кажеться проблема заключается в том, что таблица 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
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]);
iq_FileInAttendance :
INSERT INTO [dbo].[tbl_FileInAttendanceJob] ([ID], [FileID], [ContactID]) VALUES (:ID, :FileID, :ContactID)
Елена, если у вас создан раздел Посещения, то к записи каждой записи есть соотвествие с деталью Файлы, насколько я понимаю вашу задачу, то фотография у вас прикрепляется как раз к контакту (Сотруднику), почему бы не решить задачу немного иначе, добавить новую деталь, по переходу в которую подгружалась бы фотография, согласно логике, примерно такой вариант я предлагал вам http://www.community.terrasoft.ru/forum/topic/7194#comment-31015, с модификацией как в этой теме
Полностью подгружать фото в базу не очень удобно, так как фотографий очень много! и размер базы будет очень быстро рости. Поэтому лучше сохранять просто ссылки на файлы.
Дело в том, что если перейти на MS SQL 2008R2 то там можно использовать функцию внешнего зранения файлов, т.е. для системы и для пользователей это заметно не будет и все будут работать в шататном режиме, а на стороне сервера фотографии будут лежать в отдельной директории. Технология называется FileStream. На комьюнити это уже обсуждалось.
Дело в том, что если хранить ссылку на файл, то тут есть несмколько минусов
1. Это практически любой пользователь может иметь доступ ко всем файлам на шаре
2. Если нужна функция добавления/изменения для пользователя - то он может что-то повредить. :)
В сожалению, переход на другую СУБД пока что не возможен(
В том варианте как есть сейчас, на сколько я понял, в разделе Посещения, вы хотите отображать деталm [Файлы] раздела Контакты, возможно допустимым вариантом будет отображать именно деталь [Файлы] с Контактов в разделе Посещения, т.е подменить отображения этой детали, без возможности добавления файлов с этого раздела (для того что бы не нарушать логику деталей)