Re: Импорт файлов

В принципе ее можно просто пропустить и ничего не писать, а какая ошибка?

Dmitry.

27 (edited by kunar80 2014-11-21 19:02:27)

Re: Импорт файлов

Если скрипт записан так (между sid_period и  sid_room колонка вообще не учтена):

//13 sid_period
               if arrStr[13] <> '' then
               begin
                    sid_period := SQLExecute ('SELECT id FROM period WHERE period LIKE "' + arrStr[13] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO period (period) VALUES ("'+ arrStr[13] +'");');
                         sid_period := IntToStr(Last_Insert_id('period'));
                         if sid_period = '-1' then sid_period := 'NULL';
                    end;
               end else sid_period := 'NULL';

               //14 sid_room
               if arrStr[14] <> '' then
               begin
                    sid_room := SQLExecute ('SELECT id FROM room WHERE room LIKE "' + arrStr[14] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO room (room) VALUES ("'+ arrStr[14] +'");');
                         sid_room := IntToStr(Last_Insert_id('room'));
                         if sid_room = '-1' then sid_room := 'NULL';
                    end;
               end else sid_room := 'NULL';

то записывает всё, кроме значений sid_room (как я понимаю, они записываются в вычисляемую колонку, а вычисление их переписывает).
Если же присвоить номер 15 колонке sid_room:

//13 sid_period
               if arrStr[13] <> '' then
               begin
                    sid_period := SQLExecute ('SELECT id FROM period WHERE period LIKE "' + arrStr[13] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO period (period) VALUES ("'+ arrStr[13] +'");');
                         sid_period := IntToStr(Last_Insert_id('period'));
                         if sid_period = '-1' then sid_period := 'NULL';
                    end;
               end else sid_period := 'NULL';

               //15 sid_room
               if arrStr[15] <> '' then
               begin
                    sid_room := SQLExecute ('SELECT id FROM room WHERE room LIKE "' + arrStr[15] +'"');
                    if sid_period = '' then
                    begin
                         SQLExecute ('INSERT INTO room (room) VALUES ("'+ arrStr[15] +'");');
                         sid_room := IntToStr(Last_Insert_id('room'));
                         if sid_room = '-1' then sid_room := 'NULL';
                    end;
               end else sid_room := 'NULL';

то сначала ругается, как показано на картинке, но затем всё же записывает в грид 1 и 2 строчки файла из трёх возможных. Но Label показывает, что записано 3 из 3.

Post's attachments

Attachment icon 2014-11-21_203753.jpg 9.15 kb, 326 downloads since 2014-11-21 

Не боги горшки лепят!

Re: Импорт файлов

kunar80
Пришлите пожалуйста свой проект со всеми вопросами, к сожалению сложно код прокручивать в голове )

Dmitry.

Re: Импорт файлов

Отправил в личку. Сбой даёт импорт на второй вкладке. В архиве и папка с CSV. Для неё путь прописан d:\\

Не боги горшки лепят!

Re: Импорт файлов

Есть два вопроса:
1) Всё те же кавычки. Многие значения, загружаемые в проект из Excel, выглядят в документе так: Артель "Рога и копыта" товарищества "Золотой телёнок". Возможна ли загрузка в таком виде? Если да, то как это прописать?
Сейчас при таком коде:

//3 sDocName
               if arrStr[3]<>'' then sDocName := '"' +  ReplaceStr(arrStr[3], '"', '""') + '"' else sDocName := 'NULL';

результат импорта выглядит так : "Артель ""Рога и копыта"" товарищества ""Золотой телёнок""". Допустимо, чтобы при импорте кавычки вообще опускались, хотя это на крайний случай.
2) Колонка таблицы называется "Номер документа". Сейчас установлен тип "Текст", не "Целое число потому, что попадаются значения типа ЧИСЛО-буква.  Сортировка всей таблицы по этой колонке. Автоматически сортирует по первой цифре.. Получается что 10 добавляется между 1 и 2. Как сделать, чтобы значения выстраивались по возрастанию? Может как-то формат прописать, чтобы впереди нули добавлялись до, например, 4-значного числа?

Не боги горшки лепят!

Re: Импорт файлов

kunar80, возможно это из-за того, что в вашем csv в качестве разделителей используются " кавычки и поэтому встречающиеся в тексте обычные кавычки, т.е.  не в качестве разделителей становятся двойными, чтобы не образовывать новое поле (ИМХО). По-моему эти разделители можно настраивать, т.е. вместо кавычек использовать другие символы. Например, апостроф ' или точку с запятой и т.п. Поэксперементируйте...

Re: Импорт файлов

kunar80
1. Нашел пару ошибок, связанных с ошибкой импорта и кавычками. Отправил вам на e-mail исправленный проект.


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

Dmitry.

Re: Импорт файлов

Спасибо, Дмитрий. Сейчас посмотрю.

Не боги горшки лепят!

Re: Импорт файлов

Импортируется только 15 строчек таблицы и выскакивает сообщение. Что это значит? Есть ограничение?

Post's attachments

Attachment icon Ошибка импорта. Из 21 импортирует 15.jpg 9.83 kb, 333 downloads since 2014-11-26 

Не боги горшки лепят!

Re: Импорт файлов

kunar80
похоже на то, что колонок оказалось больше чем нужно, пришлите мне ваш проект с этим файлом, посмотрю.

Dmitry.

Re: Импорт файлов

DriveSoft wrote:

kunar80
похоже на то, что колонок оказалось больше чем нужно, пришлите мне ваш проект с этим файлом, посмотрю.

Спасибо за помощь. Видимо, проблема была в файле. Сделал новый, и на ура грузится сотня записей.

Не боги горшки лепят!

Re: Импорт файлов

hi Mr.kunar 80, how can change your button style and combo box style?.. using any script.. iam try  but i cant

38 (edited by kunar80 2014-11-27 09:25:25)

Re: Импорт файлов

alsu wrote:

hi Mr.kunar 80, how can change your button style and combo box style?.. using any script.. iam try  but i cant

I am new to programming. Refer to DriveSoft.

Не боги горшки лепят!

39 (edited by kunar80 2014-12-02 09:40:35)

Re: Импорт файлов

Доброго всем дня! Подскажите, что значит эта ошибка? Из нескольких сотен записей импортируется 15 и выскакивает ошибка.

Post's attachments

Attachment icon 1111-1.jpg 20.63 kb, 340 downloads since 2014-12-02 

Не боги горшки лепят!

Re: Импорт файлов

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

Dmitry.

41 (edited by omarovaasya5 2017-09-28 11:44:12)

Re: Импорт файлов

Добрый день.Подскажите пожалуйста  я не могу импортировать данные где текст на русском ,на английском записи переводит в базу  а вот с русским  не отображает

Re: Импорт файлов

omarovaasya5 wrote:

Добрый день.Подскажите пожалуйста  я не могу импортировать данные где текст на русском ,на английском записи переводит в базу  а вот с русским  не отображает

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


Скорей всего ваш csv файл имеет кодировку отличную от UTF-8 (unicode), просто перекодируйте ваш файл например с помощью программы Notepad++


если не получиться, приложите пожалуйста ваш проект с csv файлом.

Dmitry.

Re: Импорт файлов

Приветствую, а как сделать чтоб данные второй раз не добавлялись

Re: Импорт файлов

bekmametovd wrote:

Приветствую, а как сделать чтоб данные второй раз не добавлялись

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


пример скрипта

procedure Form1_Button2_OnClick (Sender: string; var Cancel: boolean);
var
   OpenDialog: TOpenDialog;
   CSV: TCSV;
   iLine: integer;
   sLastName, sFirstName, sDate: string;
begin
    OpenDialog := TOpenDialog.Create(Form1);
    OpenDialog.InitialDir := ExtractFileDir(Application.Exename);

    if OpenDialog.Execute then
    begin
        CSV := TCSV.Create;
        try
            CSV.LoadUtf8File(OpenDialog.FileName);

            for iLine := 0 to CSV.LineCount-1 do
            begin
                sLastName := '''' + escape_special_characters(CSV.Fields[iLine, 0]) + '''';
                sFirstName := '''' + escape_special_characters(CSV.Fields[iLine, 1]) + '''';
                sDate := '''' + escape_special_characters(CSV.Fields[iLine, 2]) + '''';

                // duplicate check
                if SQLExecute('SELECT COUNT(id) FROM base WHERE lastname='+sLastName+' AND ' + 'firstname='+sFirstName+' AND datefield=' + sDate + ' LIMIT 1') = '0' then
                begin
                    SQLExecute ('INSERT INTO base (lastname, firstname, datefield) VALUES ('+ sLastName +','+ sFirstName +','+ sDate +')');
                end;

                Form1.Label1.Caption := IntToStr(iLine+1) + ' of ' + IntToStr(CSV.LineCount);
                Application.ProcessMessages;
            end;

        finally
            CSV.Free;
        end;


        Form1.TableGrid1.dbUpdate;
     end;
     OpenDialog.Free;

end;

Проект с данным примером:

Post's attachments

Attachment icon Import CSV simple TCsv check duplicate.zip 6.87 kb, 274 downloads since 2019-07-25 

Dmitry.