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

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

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

Ув. Дмитрий. В данном примере все работает отлично. Можно ли сделать так чтобы дубликаты записей обновились во всех таблицах?
Помогите с реализацией.

DriveSoft wrote:

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

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

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

Dmitry.

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

Ув. Дмитрий.
Пример взят с первого проекта прикрепленного на первом посту данной темы (Import-Export with autofill dictionaries.zip). Я тут добавил еще и таблицу department.  При экспорте и импорте все работает нормально. Я приведу описание пользователя jonibek. У меня имеется несколько отделов, которым я даю эту программу и они вводят данные и делают экспорт, а я импортирую их данные. Теперь в списке ggg. У него заработная плата 333. Сделали экспорт данных и принесли мне. Я делаю импорт, все ок. Теперь заработная плата ggg изменился на 5000. Сделали экспорт, принесли мне, а у меня все еще стоит 333. Т.е. так как у меня уже ранее был Иванов, то его другие параметры были игнорированы. Надо чтобы при импорте были импортированы другие параметры если имеются изменения в них. Также если в таблице subdivision добавли d то надо чтобы она была добавлена в таблицу subdivision при импорте если её нет у меня в таблице. Таким же образом надо чтобы и при добавлении новых данных в таблицу department были добавлены в моей таблице. Помогите пожалуйста. Проект прилагается.

Post's attachments

Attachment icon Import-Export with autofill dictionaries.zip 16.1 kb, 445 downloads since 2019-04-23 

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

К сожалению звучит довольно сложно и запутано, как правило я могу помочь с решением конкретных вопросов.

Dmitry.

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

DriveSoft wrote:

К сожалению звучит довольно сложно и запутано, как правило я могу помочь с решением конкретных вопросов.

Объясню попроше на примере.
Имеются таблицы:
[employees]
isdictionary=0
_lastname=TEXT
_firstname=TEXT
_dateofbirth=DATE
_salary=REAL
_isSmoke=BOOLEAN
_comment=TEXT
>id_subdivision=subdivision
>id_department=department

[subdivision]
isdictionary=0
_subdivisionname=TEXT (в нем есть записи a, b, c)

[department]
isdictionary=0
_depname=TEXT ((в нем есть записи 1, 2, 3))


1. Теперь на примере покажу. Это данные в гриде. Делают экспорт и приносят мне.
Имя     Фамилия     Subdivision    Salary     Smoke   Department
Иван     Иванов               a                333             да                 1

2. Изменяю данные в гриде типа этого.
Имя     Фамилия     Subdivision    Salary     Smoke   Department
Иван     Иванов               b                888             да                 2

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

3. Это данные в гриде. Делают экспорт и приносят мне.
Имя     Фамилия     Subdivision    Salary     Smoke   Department
Иван     Иванов               d                333             да                 4

В моей базе данных в таблице Subdivision нет записи d, также в таблице Department нет записи 4.
Во время импорта надо чтобы эти таблицы обновились и соответственно в гриде было все как на примере 3.
Помогите с реализацией. Очень надо. Спасибо заранее. Проект прилагаю.

Post's attachments

Attachment icon Import-Export with autofill dictionaries.zip 16.15 kb, 459 downloads since 2019-04-26 

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

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

Dmitry.

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

В 9 посте этой темы вы сделали пример то что мне надо, но там учитывается только одна таблица. Можно ли такой же пример вот только с проектом поста 21?

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

я так понимаю на мой вопрос так и не будет ответа. Спасибо.

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

ivan wrote:

я так понимаю на мой вопрос так и не будет ответа. Спасибо.

сейчас выходные ...