Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Отсекаются впереди стоящие нули кода в varchar  [new]
Sergius1989
Member

Откуда:
Сообщений: 4
В базу импортируются ячейки Excel. Файл Excel менять нельзя, он создается в другом месте, где все данные в виде текста. Импорт идет через Oleobject и функцию trim. При записи в базу у кодов типа varchar например 030021 отсекаются первые нули и в таблицу попадает 30021. В чем загвоздка?
28 авг 12, 12:20    [13074963]     Ответить | Цитировать Сообщить модератору
 Re: Отсекаются впереди стоящие нули кода в varchar  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
В вашем импорте "через Oleobject и функцию trim", что бы это ни значило.

Сообщение было отредактировано: 28 авг 12, 12:23
28 авг 12, 12:23    [13074992]     Ответить | Цитировать Сообщить модератору
 Re: Отсекаются впереди стоящие нули кода в varchar  [new]
Sergius1989
Member

Откуда:
Сообщений: 4
Гавриленко Сергей Алексеевич,

Это значит:
procedure TForm2.Button2Click(Sender: TObject);
var
excel:OleVariant;
workbook: OleVariant;
sheet: OleVariant;
i,y: integer;
p:real;
stkol:integer;
stDate1,stNV:Variant;
stDate2:TDatetime;
stNakl,stNameGP,stNameGO,stNameDep,stNameArr,stNameETSNG,stNameRV:string;
stKGO,stKGP,stKETSNG,stKDep,stKArr,stKRV:string;
stSumDep,stNDSDep,stSumArr,stNDSArr:Currency;
BEGIN
 Excel := CreateOleObject('Excel.Application');
 excel.workbooks.open(Edit1.Text,false);
 workbook:=excel.workbooks.item[1];
 sheet := workbook.worksheets[1];
 sheet.cells.specialcells(xlcelltypelastcell,emptyparam).activate;
 y := excel.activecell.row;
 with cxprogressbar1 do
  begin
  Visible:=true;
  end;

 for i:=2 to y do
   begin
    p:=i/y*100;
    stNakl:=TrimRight(sheet.cells[i,1]);
    try
      stDate1:=VarToDateTime(trim(sheet.cells[i,2]));
      except on E:exception do
      stDate1:=null;
    end;
    stDate2:=StrToDateTime(trim(sheet.cells[i,3]));
    stKGO:=trimright(sheet.cells[i,4]);
    stNameGO:=trim(sheet.cells[i,5]);
    stKGP:=trimright(sheet.cells[i,6]);
    stNameGP:=trim(sheet.cells[i,7]);
    stKDep:=trimright(sheet.cells[i,8]);
    stNameDep:=trim(sheet.cells[i,9]);
    stKArr:=trimright(sheet.cells[i,10]);
    stNameArr:=trim(sheet.cells[i,11]);
    stKETSNG:=trimright(sheet.cells[i,12]);
    stNameETSNG:=trim(sheet.cells[i,13]);
    stNV:=trimright(sheet.cells[i,14]);

Словил exceptionом сообщения ошибок, он предупреждает, что данные могут быть усечены при вставке строк с таким значениями.
28 авг 12, 12:28    [13075045]     Ответить | Цитировать Сообщить модератору
 Re: Отсекаются впереди стоящие нули кода в varchar  [new]
aleks2
Guest
Sergius1989
В базу импортируются ячейки Excel. Файл Excel менять нельзя, он создается в другом месте, где все данные в виде текста. Импорт идет через Oleobject и функцию trim. При записи в базу у кодов типа varchar например 030021 отсекаются первые нули и в таблицу попадает 30021. В чем загвоздка?

Oleobject автоматически определяет ваши данные как "числа" и конвертирует с усечением ведущего нуля.
Скажите своему Oleobject, что это текст и вам полегчает.
28 авг 12, 12:30    [13075068]     Ответить | Цитировать Сообщить модератору
 Re: Отсекаются впереди стоящие нули кода в varchar  [new]
aleks2
Guest
Sergius1989
Это значит:
procedure TForm2.Button2Click(Sender: TObject);
var
excel:OleVariant;
workbook: OleVariant;
sheet: OleVariant;
i,y: integer;
p:real;
stkol:integer;
stDate1,stNV:Variant;
stDate2:TDatetime;
stNakl,stNameGP,stNameGO,stNameDep,stNameArr,stNameETSNG,stNameRV:string;
stKGO,stKGP,stKETSNG,stKDep,stKArr,stKRV:string;
stSumDep,stNDSDep,stSumArr,stNDSArr:Currency;
BEGIN
 Excel := CreateOleObject('Excel.Application');
 excel.workbooks.open(Edit1.Text,false);
 workbook:=excel.workbooks.item[1];
 sheet := workbook.worksheets[1];
 sheet.cells.specialcells(xlcelltypelastcell,emptyparam).activate;
 y := excel.activecell.row;
 with cxprogressbar1 do
  begin
  Visible:=true;
  end;

 for i:=2 to y do
   begin
    p:=i/y*100;
    stNakl:=TrimRight(sheet.cells[i,1]);
    try
      stDate1:=VarToDateTime(trim(sheet.cells[i,2]));
      except on E:exception do
      stDate1:=null;
    end;
    stDate2:=StrToDateTime(trim(sheet.cells[i,3]));
    stKGO:=trimright(sheet.cells[i,4]);
    stNameGO:=trim(sheet.cells[i,5]);
    stKGP:=trimright(sheet.cells[i,6]);
    stNameGP:=trim(sheet.cells[i,7]);
    stKDep:=trimright(sheet.cells[i,8]);
    stNameDep:=trim(sheet.cells[i,9]);
    stKArr:=trimright(sheet.cells[i,10]);
    stNameArr:=trim(sheet.cells[i,11]);
    stKETSNG:=trimright(sheet.cells[i,12]);
    stNameETSNG:=trim(sheet.cells[i,13]);
    stNV:=trimright(sheet.cells[i,14]);


О!!! Как фсе запущено.
28 авг 12, 12:32    [13075081]     Ответить | Цитировать Сообщить модератору
 Re: Отсекаются впереди стоящие нули кода в varchar  [new]
Sergius1989
Member

Откуда:
Сообщений: 4
aleks2, подскажите пожалуйста как, первый раз с ним работаю.
28 авг 12, 12:32    [13075083]     Ответить | Цитировать Сообщить модератору
 Re: Отсекаются впереди стоящие нули кода в varchar  [new]
aleks2
Guest
Sergius1989
aleks2, подскажите пожалуйста как, первый раз с ним работаю.

А я с ним уже сто лет не работал.

1. В первой ячейке колонки вколотить "явственный текст" - тогда автодетектирование правильно автодетектирует.
2. Назначить Формат "текст" на колонку.
3. Вводить данные с префиксом ' - что есть "явственный текст" для Excel.
28 авг 12, 12:36    [13075120]     Ответить | Цитировать Сообщить модератору
 Re: Отсекаются впереди стоящие нули кода в varchar  [new]
Sergius1989
Member

Откуда:
Сообщений: 4
Ерунда получается. При указывании параметров NumberFormat:='@' он все равно импортирует как хочет, а в конце хочет внести изменения в исходный файл. Может кто нить конкретно сказать как ему нужные параметры присвоить.
28 авг 12, 16:53    [13077641]     Ответить | Цитировать Сообщить модератору
 Re: Отсекаются впереди стоящие нули кода в varchar  [new]
qwerty112
Guest
Sergius1989,

открой на этом листе Адо-рекордсет с IMEX=2,
тогда всё на листе будет интерпретироватся как текст

и потом циклом по рекордсету - сохраняеш в таб.сервера

или тоже, через OPENROWSET, одним запросом, если файл доступен серверу

зы
вопрос и рядом "не валялся" с МС СКЛ
28 авг 12, 17:53    [13078110]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить