Import danych z pliku tekstowego

0

Cześć,
Mam przygotowany plik .txt który chcę zaimportować przez ibexpert
Moje kolumny to:
ID_MAGAZYNU, KOD, ID_MSCSKLADOWANIA

ID_MAGAZYNU jest
KOD jest
ID_MSCSKLADOWANIA brak

Potrzebuję zaimportować dane, lecz zmodyfikować zapytanie, gdyż wartości ID_MSCSKLADOWANIA nie ma, dlatego, że ta wartość powinna być unikalna w systemie.
Podczas importu sprawdzana ostatnia wartość, każdy kolejny rekord to wartość aktualna + 1.

0

Niewiele z tego opisu rozumiem

  1. to masz miejsce składowania w txt czy nie?
  2. ma być miejsce składowania w txt czy nie?
  3. czy przypadkiem ID_MSCSKLADOWANIA nie jest kluczem obcym, który nie ma w odpowiedniej tabeli wpisów dla ID_MSCSKLADOWANIA z txt?
0
abrakadaber napisał(a):

Niewiele z tego opisu rozumiem

  1. to masz miejsce składowania w txt czy nie?
  2. ma być miejsce składowania w txt czy nie?
  3. czy przypadkiem ID_MSCSKLADOWANIA nie jest kluczem obcym, który nie ma w odpowiedniej tabeli wpisów dla ID_MSCSKLADOWANIA z txt?

Moje dane do importu składają się z dwóch kolumn

ID_MAGAZYNU KOD
Dane Dane

ID_MSCSKLADOWANIA jest zapisane w tej samej tabeli, a każda jej wartość jest typu INTEGER.

Dane ID_MAGAZYNU oraz KOD mają być importowane z pliku .txt, a ID_MSCSKLADOWANIA ma patrzyć na tą kolumnę, szukać największej wartości i wpisać wartość aktualna + 1 do nowego wpisu, robić tak, aż skończy się plik do importu .txt

1

a nie prościej uzupełnić tą kolumnę po imporcie np. z generatora

CREATE GENERATOR gen_MSCSKLADOWANIA;
SET GENERATOR gen_MSCSKLADOWANIA TO 0;

update nazwa_tabeli set ID_MSCSKLADOWANIA  = GEN_ID(gen_MSCSKLADOWANIA, 1) where ID_MSCSKLADOWANIA  is null
0

a ID_MSCSKLADOWANIA ma patrzyć na tą kolumnę, szukać największej wartości i wpisać wartość aktualna + 1 do nowego wpisu, robić tak, aż skończy się plik do importu .txt

Z opisu wynika że kolumna ID_MSCSKLADOWANIA jest kolumną typu autoincrement . Możesz zastosować rozwiązanie podane przez @abrakadaber , albo dodatkowo zdefiniować trigger który przy pomocy generatora, na bieżąco, będzie wstawiał unikalne wartości .

CREATE GENERATOR gen_MSCSKLADOWANIA;
SET GENERATOR gen_MSCSKLADOWANIA TO 0;

CREATE TRIGGER BEFORE_TABELA_INSERT  FOR TABELA
ACTIVE BEFORE INSERT
AS
  BEGIN 
     NEW.ID_MSCSKLADOWANIA = GEN_ID( gen_MSCSKLADOWANIA, 1); 
  END;
0

Czyżby Streamsoft? Ja bym powiedział, że skorzystanie z ISTNIEJĄCEGO generatora jest mocno wskazane. W przeciwnym wypadku aplikacja, która z tej bazy korzysta (zapewne jakiś ERP lub WMS) przy tworzeniu kolejnego miejsca składowania wygeneruje zdublowany ID i w najlepszym wypadku sypnie błędem, a w najgorszym popsuje dane

0

Niestety ale przy imporcie musi być unikalna wartość liczbowa w ID_MSCSKLADOWANIA (wartość ta ma być tylko unikalna dla tabeli MSCSKLADOWANIA w której jest ID_MSCSKLADOWANIA)
Jeśli nie podmapuje żadnej kolumny z mojego pliku importu do ID_MSCSKLADOWANIA to mam następujący błąd.
Jak podmapuje kolumnę bez wartości również błąd.
Nie wiem jak to obejść.

grzegorz_so napisał(a):

a ID_MSCSKLADOWANIA ma patrzyć na tą kolumnę, szukać największej wartości i wpisać wartość aktualna + 1 do nowego wpisu, robić tak, aż skończy się plik do importu .txt

Z opisu wynika że kolumna ID_MSCSKLADOWANIA jest kolumną typu autoincrement . Możesz zastosować rozwiązanie podane przez @abrakadaber , albo dodatkowo zdefiniować trigger który przy pomocy generatora, na bieżąco, będzie wstawiał unikalne wartości .

CREATE GENERATOR gen_MSCSKLADOWANIA;
SET GENERATOR gen_MSCSKLADOWANIA TO 0;

CREATE TRIGGER BEFORE_TABELA_INSERT  FOR TABELA
ACTIVE BEFORE INSERT
AS
  BEGIN 
     NEW.ID_MSCSKLADOWANIA = GEN_ID( gen_MSCSKLADOWANIA, 1); 
  END;

Pomocne, lecz jak dostosować to do mojego zapytania poniżej? @grzegorz_so

A tak wygląda moje zapytanie które potrzebuję zmodyfikować aby nadawany był automatycznie ID_MSCSKLADOWANIA

execute ibeblock
as
begin
  cbb = 'execute ibeblock (RecCount variant)
         as
         begin
           if (ibec_Mod(RecCount, 100) = 0) then
             ibec_Progress(RecCount || '' records imported.'');
         end;';
  
  DB = ibec_CreateConnection(__ctFirebird, 'DBName="XXX";
                                            ClientLib=XXX\gds32.dll;
                                            User=XXX; Password=XXX; Names=NONE; SqlDialect=3;');
  try
    ibec_UseConnection(DB);
    Res = ibec_ImportData(DB, '', __impText, 'XXX.txt', '', 
                          'RowFirst=1; RowLast=2147483647;
                           DateOrder=YMD; DateSeparator=";"; TimeSeparator=";";
                           CSVDelimiter=TAB; RecordSeparator=CRLF; StringQualifier=DoubleQuote;', '', cbb);
  
    if (Res is not null) then
      ibec_ShowMessage(Res || ' records were imported successfully.');
  finally
    ibec_CloseConnection(DB);
  end;

end
0

@lonacic550:
Info o błędzie mówi że kolumna id_mscskladowania nie może być null. Właśnie w tym celu należy zdefiniować generator oraz powiązany z nim trigger, aby silnik bazy sam dbał o wstawianie unikalnych wartość w kolumnę,

1 użytkowników online, w tym zalogowanych: 0, gości: 1