Topic: [Скрипт] Импорт и Экспорт записей

Пример универсального скрипта для экспорта и импорта данных из таблиц (Import-Export.zip). Вам просто необходимо указать столбцы в параметрах процедуры, которые должны быть импортированы или экспортированы.


В файле "Import-Export with autofill dictionaries.zip"  вы найдете проект с примером, который работает и со словарями, автоматически дополняя их, если значение отсутствует в таблице.


procedure Form1_bExport_OnClick (Sender: string; var Cancel: boolean);
begin
    Export('SELECT lastname, firstname, salary, dateofbirth, isSmoke, comment FROM employees', '1.csv');
end;

procedure Form1_bImport_OnClick (Sender: string; var Cancel: boolean);
begin
    Import('employees', 'lastname,firstname,salary,dateofbirth,isSmoke,comment', '1.csv');
end;

procedure Form1_bImportCheckDup_OnClick (Sender: string; var Cancel: boolean);
begin
    Import('employees', 'lastname,firstname,salary,dateofbirth,isSmoke,comment', '1.csv', 'lastname,firstname');
end;                                             




                                                          
procedure Export (SQL: string; FileName: string);
var
    Results: TDataSet;
    i,c: integer;
    sl: TStringList;
    sValue, sValues: string;
begin

    SQLQuery(sql, Results);
    sl := TStringList.Create;
    c := Results.FieldCount-1;

    while not Results.eof do
    begin
        sValues := '';
        for i := 0 to c do
        begin
            if not Results.Fields.Fields[i].isNull then
            begin
                sValue := Results.Fields.Fields[i].AsString;

                if (Results.Fields.Fields[i].DataType = ftFloat) or (Results.Fields.Fields[i].DataType = ftLargeint) then
                    sValue := ReplaceStr(sValue, ',', '.')
                else
                begin
                    sValue := ReplaceStr(sValue, ',', ',');
                    sValue := ReplaceStr(sValue, #13#10, '|');
                    sValue := '''' + escape_special_characters(sValue) + '''';
                end;
            end else sValue := 'NULL';

            sValues := sValues + sValue+',';
        end;

        if sValues <> '' then SetLength(sValues, Length(sValues)-1);
        sl.Add(sValues);
        Results.next;
    end;

    sl.SaveToFile(FileName);
    sl.Free;
    Results.Close;
end;

procedure Import(TableName, Fields: string; FileName: string; CheckDuplicateFields: string = '');
    function ArrayInCheck(a: array of string; sValue: string): boolean;
    var
        i,c: integer;
    begin
        result := False;
        c := Length(a)-1;
        for i := 0 to c do
        begin
            if LowerCase(a[i])=LowerCase(sValue) then
            begin
                result := true;
                break;
            end;
        end;
    end;
var
    iField, cField: integer;
    iLine, cLine: integer;
    sl: TStringList;
    arrValues: array of string;
    arrFields: array of string;
    arrFieldsDuplicate: array of string;
    sValue, sValues: string;
    sWhereDuplicate: string;
begin
    if CheckDuplicateFields <> '' then arrFieldsDuplicate := SplitString(CheckDuplicateFields, ',');

    sl := TStringList.Create;
    sl.LoadFromFile(FileName);
    arrFields := SplitString(Fields, ',');
    cLine := sl.Count-1;

    for iLine := 0 to cLine do
    begin
        sValues := '';
        arrValues := SplitString(sl[iLine], ',');
        if Length(arrFields) <= Length(arrValues) then
        begin
            sWhereDuplicate := '';
            cField := Length(arrFields)-1;
            for iField := 0 to cField do
            begin
                sValue := arrValues[iField];
                sValue := ReplaceStr(sValue, '&comma;', ',');
                sValue := ReplaceStr(sValue, '|', #13#10);
                sValues := sValues + sValue+',';


                if ArrayInCheck(arrFieldsDuplicate, arrFields[iField]) then
                    sWhereDuplicate := sWhereDuplicate +'('+ arrFields[iField]+'='+sValue + ') AND ';
            end;

            if sValues <> '' then
            begin
                SetLength(sValues, Length(sValues)-1);

                if sWhereDuplicate <> '' then
                begin
                    SetLength(sWhereDuplicate, Length(sWhereDuplicate)-5);
                    if SQLExecute('SELECT COUNT(id) FROM '+TableName+' WHERE '+sWhereDuplicate)=0 then
                        SQLExecute('INSERT INTO '+TableName+' ('+Fields+') VALUES ('+sValues+')');
                end else
                    SQLExecute('INSERT INTO '+TableName+' ('+Fields+') VALUES ('+sValues+')');
            end;

        end;
    end;

    sl.Free;
end;


Проект с примером:

Post's attachments

Attachment icon Import-Export with autofill dictionaries.zip 14.89 kb, 48 downloads since 2018-07-03 

Attachment icon Import-Export.zip 12.33 kb, 91 downloads since 2018-07-03 

Dmitry.

Re: [Скрипт] Импорт и Экспорт записей

Здравствуйте, Дмитрий.

Подскажите, в чём может быть ошибка?
https://c.radikal.ru/c06/1802/df/a7ff16fef49c.jpg

Спасибо.

Yana

Re: [Скрипт] Импорт и Экспорт записей

Здравствуйте.


Видимо у вас старая версия программы, скачайте пожалуйста последнюю версию.

Dmitry.

Re: [Скрипт] Импорт и Экспорт записей

Уважаемы Дмитрий. Где то была тема про импорт и экспорт, но там был запрет дубликата записей. Можете дать ссылку?

Re: [Скрипт] Импорт и Экспорт записей

так эта она и есть, тот скрипт который выше запрещает импорт если такая записю уже существует

if SQLExecute('SELECT COUNT(id) FROM '+TableName+' WHERE '+sWhereDuplicate)=0 then......

Re: [Скрипт] Импорт и Экспорт записей

Спасибо. Есть один нюанс. Объясню на примере прикрепленной выше.
У меня имеется несколько отделов, которым я даю эту программу и они вводят данные и делают экспорт, а я импортирую их данные. Теперь в списке Ivan Ivanov. У него заработная плата 6000,5. Сделали экспорт данных и принесли мне. Я делаю импорт, все ок. Теперь заработная плата Иванова изменился на 5000. Сделали экспорт, принесли мне, а у меня все еще стоит 6000,5. Т.е. так как у меня уже ранее был Иванов, то его другие параметры были игнорированы. Надо чтобы при импорте были импортированы другие параметры если имеются изменения в них.
Еще раз спасибо.

Re: [Скрипт] Импорт и Экспорт записей

jonibek
Необходимо модифицировать скрипт импорта. Создайте пожалуйста отдельную тему на форуме и приложите свой проект.


Но в целом это неудачное решение, использование импорта и экспорта для сбора данных. Рассмотрите возможность использования клиент серверной базы данных MySQL, т.е. все пользователи будут подключаться к одной базе данных через интернет.

Dmitry.

Re: [Скрипт] Импорт и Экспорт записей

можете сделать на примере того проекта, который уже имеется http://myvisualdatabase.com/forum/misc. … ownload=1?

Re: [Скрипт] Импорт и Экспорт записей

jonibek wrote:

можете сделать на примере того проекта, который уже имеется http://myvisualdatabase.com/forum/misc. … ownload=1?

Доработал проект, при нажатии на кнопку Import and check duplicate, записи будут импортированы, если встречается дубликат, тогда данные этой записи будут обновлены.

Post's attachments

Attachment icon Import-Export_fixed.zip 13.05 kb, 136 downloads since 2018-02-09 

Dmitry.

Re: [Скрипт] Импорт и Экспорт записей

Спасибо большое

Re: [Скрипт] Импорт и Экспорт записей

Ув. Дмитрий. Является ли слово foreign резервным словом в MVD?

Re: [Скрипт] Импорт и Экспорт записей

Ув. Дмитрий. На вашем примере (пост 9) есть 2 нюанса, которые не учитывается. Напишу порядок действий.
1. Если оставить поле DateTimePicker пустым, сохраняем, далее экспорт, затем импорт, затем при открытии этой записи выскакивает сообщение о том, что поле не может быть пустым.
2. Если оставить поле ComboBox пустым, сохраняем, далее экспорт, затем при импорте возникает ошибка - 'FOREIGN KEY constraint failed'. Т.е. здесь на этапе импортирования возникает ошибка.

Re: [Скрипт] Импорт и Экспорт записей

jonibek wrote:

Ув. Дмитрий. Является ли слово foreign резервным словом в MVD?

Да. А именно FOREIGN KEY

Dmitry.

Re: [Скрипт] Импорт и Экспорт записей

jonibek wrote:

Ув. Дмитрий. На вашем примере (пост 9) есть 2 нюанса, которые не учитывается. Напишу порядок действий.
1. Если оставить поле DateTimePicker пустым, сохраняем, далее экспорт, затем импорт, затем при открытии этой записи выскакивает сообщение о том, что поле не может быть пустым.
2. Если оставить поле ComboBox пустым, сохраняем, далее экспорт, затем при импорте возникает ошибка - 'FOREIGN KEY constraint failed'. Т.е. здесь на этапе импортирования возникает ошибка.

Если я правильно понял, данные ошибки возникают в вашем проекте, т.к. в моем примере нет ComboBox-а, пожалуйста создайте отдельную тему с описанием данной проблемы и приложите ваш проект.

Dmitry.

Re: [Скрипт] Импорт и Экспорт записей

Добрый день! а возможно ли экспортировать в файл не id записи связанных таблиц, а их реальные значения, ну например у сотрудника есть связанная таблица "пол", в ней есть значения мужской/женский, так вот при эспорте чтоб выгружалось именно мужской или женский, а не 1 или 2.
есть конечно вариант выгрузить таблицу в ексель, а потом из екселя сделать csv, но это муторно и не все пользователи до такого додумаются.
если конечно такое не трудоемко

Re: [Скрипт] Импорт и Экспорт записей

pt.82 wrote:

Добрый день! а возможно ли экспортировать в файл не id записи связанных таблиц, а их реальные значения, ну например у сотрудника есть связанная таблица "пол", в ней есть значения мужской/женский, так вот при эспорте чтоб выгружалось именно мужской или женский, а не 1 или 2.
есть конечно вариант выгрузить таблицу в ексель, а потом из екселя сделать csv, но это муторно и не все пользователи до такого додумаются.
если конечно такое не трудоемко


Для формирования экспорта используется SQL запрос, поэтому достаточно написать соответствующий SQL запрос

Export('SELECT employees.lastname, employees.firstname, sex.sexname FROM employees LEFT OUTER JOIN sex ON sex.id=employees.id_sex', '1.csv');

также в первом сообщении есть пример для импорта, который сам автоматически заполняет словари и подставляет из них данные при импорте
"Import-Export with autofill dictionaries.zip"

Dmitry.