Re: Импорт файлов
В принципе ее можно просто пропустить и ничего не писать, а какая ошибка?
My Visual Database → Russian → Импорт файлов
В принципе ее можно просто пропустить и ничего не писать, а какая ошибка?
Если скрипт записан так (между 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.
kunar80
Пришлите пожалуйста свой проект со всеми вопросами, к сожалению сложно код прокручивать в голове )
Отправил в личку. Сбой даёт импорт на второй вкладке. В архиве и папка с CSV. Для неё путь прописан d:\\
Есть два вопроса:
1) Всё те же кавычки. Многие значения, загружаемые в проект из Excel, выглядят в документе так: Артель "Рога и копыта" товарищества "Золотой телёнок". Возможна ли загрузка в таком виде? Если да, то как это прописать?
Сейчас при таком коде:
//3 sDocName
if arrStr[3]<>'' then sDocName := '"' + ReplaceStr(arrStr[3], '"', '""') + '"' else sDocName := 'NULL';
результат импорта выглядит так : "Артель ""Рога и копыта"" товарищества ""Золотой телёнок""". Допустимо, чтобы при импорте кавычки вообще опускались, хотя это на крайний случай.
2) Колонка таблицы называется "Номер документа". Сейчас установлен тип "Текст", не "Целое число потому, что попадаются значения типа ЧИСЛО-буква. Сортировка всей таблицы по этой колонке. Автоматически сортирует по первой цифре.. Получается что 10 добавляется между 1 и 2. Как сделать, чтобы значения выстраивались по возрастанию? Может как-то формат прописать, чтобы впереди нули добавлялись до, например, 4-значного числа?
kunar80, возможно это из-за того, что в вашем csv в качестве разделителей используются " кавычки и поэтому встречающиеся в тексте обычные кавычки, т.е. не в качестве разделителей становятся двойными, чтобы не образовывать новое поле (ИМХО). По-моему эти разделители можно настраивать, т.е. вместо кавычек использовать другие символы. Например, апостроф ' или точку с запятой и т.п. Поэксперементируйте...
kunar80
1. Нашел пару ошибок, связанных с ошибкой импорта и кавычками. Отправил вам на e-mail исправленный проект.
2. К сожалению если поле текстового типа, сортировка будет работать также по текстовому типу, ведущие нули думаю в этом случае не помогут.
Можно разделить номер документа на два поля, в одном будет только число, а в другом буква, и сортировать по числовому полю.
Спасибо, Дмитрий. Сейчас посмотрю.
Импортируется только 15 строчек таблицы и выскакивает сообщение. Что это значит? Есть ограничение?
kunar80
похоже на то, что колонок оказалось больше чем нужно, пришлите мне ваш проект с этим файлом, посмотрю.
kunar80
похоже на то, что колонок оказалось больше чем нужно, пришлите мне ваш проект с этим файлом, посмотрю.
Спасибо за помощь. Видимо, проблема была в файле. Сделал новый, и на ура грузится сотня записей.
hi Mr.kunar 80, how can change your button style and combo box style?.. using any script.. iam try but i cant
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.
Доброго всем дня! Подскажите, что значит эта ошибка? Из нескольких сотен записей импортируется 15 и выскакивает ошибка.
kunar80
похоже на то, что колонок в импортируемом файле оказалось больше чем нужно.
Колонки в csv файле разделяются точкой с запятой, возможно в самих данных где то есть точка с запятой, и т.о. получилась лишняя колонка.
Добрый день.Подскажите пожалуйста я не могу импортировать данные где текст на русском ,на английском записи переводит в базу а вот с русским не отображает
Добрый день.Подскажите пожалуйста я не могу импортировать данные где текст на русском ,на английском записи переводит в базу а вот с русским не отображает
Здравствуйте.
Скорей всего ваш csv файл имеет кодировку отличную от UTF-8 (unicode), просто перекодируйте ваш файл например с помощью программы Notepad++
если не получиться, приложите пожалуйста ваш проект с csv файлом.
Приветствую, а как сделать чтоб данные второй раз не добавлялись
Приветствую, а как сделать чтоб данные второй раз не добавлялись
Здравствуйте.
пример скрипта
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;
Проект с данным примером:
My Visual Database → Russian → Импорт файлов
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi