Загрузка Фото

Скажите возможно ли загрузить фото для просмотра не занося его при этом в поле таблицы? Т.е. подгрузить в окно, посмотреть и при закрытии окна, фотография не сохраняется в базе.

Если такого способа нет, можно ли в деталь Файлы заносить ссылку на фотографию, но не вручную, а при добавлении записи в таблицу?

Нравится

13 комментариев

В продолжение темы 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'; - формируем путь к файлу, название файла должно быть ФИО контакта, можете сделать варианты

а если не на ОК карточки редактирования (в разделе ее нету), а, например, на кнопку в разделе
111

как определить к какому контакту прикреплять файл?

Получить 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 2005

Дело в том, что если перейти на MS SQL 2008R2 то там можно использовать функцию внешнего зранения файлов, т.е. для системы и для пользователей это заметно не будет и все будут работать в шататном режиме, а на стороне сервера фотографии будут лежать в отдельной директории. Технология называется FileStream. На комьюнити это уже обсуждалось.
Дело в том, что если хранить ссылку на файл, то тут есть несмколько минусов
1. Это практически любой пользователь может иметь доступ ко всем файлам на шаре
2. Если нужна функция добавления/изменения для пользователя - то он может что-то повредить. :)

В сожалению, переход на другую СУБД пока что не возможен(

В том варианте как есть сейчас, на сколько я понял, в разделе Посещения, вы хотите отображать деталm [Файлы] раздела Контакты, возможно допустимым вариантом будет отображать именно деталь [Файлы] с Контактов в разделе Посещения, т.е подменить отображения этой детали, без возможности добавления файлов с этого раздела (для того что бы не нарушать логику деталей)

Показать все комментарии