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, 5 downloads since 2018-07-03 

Attachment icon Import-Export.zip 12.33 kb, 11 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, 94 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.