Relacje dbf

0

Witam

Uczę się programować w D7 i próbuje stworzyć procedure wybierającą
pewne dane z tabel źródłowych i zapisujaca do tabeli roboczej -
procedura j/n.

Niestety jakoś nie działa mi relacja w tabeli wynikowej ROB mam
wszystkie potrzebne dane pobrane z tabeli DANE natomiast danychy z
tabeli podrzędnej prac nie ma w ogóle lub do wszystkich rekordów
przypisane są te same dane np z rekordu pierwszego tabeli prac (nie jest to
reguła że akurat z rekordu I)

Coś robie źle - prosze o pomoc i wskazanie błędu.

Z góry bardzo dziękuje

Procedure TForm30.wst_fm();

begin
Dm.prac.IndexName:='prac-s';
DM.prac.MasterSource:=DM.DSdane;
DM.prac.MasterFields:='symbol_p';
DM.rob.EmptyTable;
DM.rob.Edit;
DM.dane.DisableControls;
DM.dane.First;
Form30.bar1.Min :=0;
Form30.Bar1.Max := DM.dane.RecordCount;
Form30.Bar1.Position := 0;

while not DM.dane.Eof do
begin
Form30.Bar1.Position := Form30.Bar1.Position+1;
IF (DM.dane.FieldByName('typ_s').AsString = 'F') AND
(DM.dane.FieldByName('pkzp').AsString = 'T')then
begin
DM.rob.Append;
DM.rob.FieldByName('nazwisko').AsString := DM.prac.Fieldbyname
('NAZWISKO').AsString; ;
DM.rob.FieldByName('ul').AsString := DM.prac.Fieldbyname
('ul').AsString;
DM.rob.FieldByName('symbol_p').AsString := DM.prac.Fieldbyname
('symbol_p').AsString;
DM.rob.FieldByName('miej').AsString := DM.prac.Fieldbyname
('miejscowos').AsString;
DM.rob.FieldByName('opis_o').AsString := DM.prac.Fieldbyname
('opis_o').AsString;
DM.rob.FieldByName('opis_o1').AsString := DM.prac.Fieldbyname
('opis_o1').AsString;
DM.rob.FieldByName('nazwas').AsString := DM.dane.Fieldbyname
('nazwas').AsString;
DM.rob.FieldByName('numer').AsString := DM.dane.Fieldbyname
('numer').AsString;
DM.rob.FieldByName('kwota_s').AsCurrency := DM.dane.Fieldbyname
('kwota_s').AsCurrency;
DM.rob.FieldByName('splacono').AsCurrency := DM.dane.Fieldbyname
('jeszcze').AsCurrency;
DM.rob.FieldByName('data_u_p').AsDateTime := DM.dane.Fieldbyname
('przyznanie').AsCurrency;
DM.rob.FieldByName('data_r_s').AsDateTime := DM.dane.Fieldbyname
('data_rs').AsCurrency;
DM.rob.FieldByName('data_z_s').AsDateTime := DM.dane.Fieldbyname
('data_s').AsCurrency;
end;
DM.dane.Next;
end;
DM.prac.MasterSource:=nil;
DM.prac.MasterFields:='';
Dm.prac.IndexName:='prac';
DM.dane.EnableControls;
DM.rob.Post;
DM.rob.First;
end;

0

Witaj.
Używasz jakiegoś "gotowca" DM, który nie wiem jak działa.
Ale jeśli masz trudność z lokalizacją błędu to wymuś aby tabela 1 miała jeden rekord a tabela 2 miała dwa rekordy, z których

wersja 1.
oba rekordy należą do rekordu z tabeli 1

wersja 2.
pierwszy rekord należy do rekordu tabeli 1

wersja 3.
drugi rekord należy do rekordu z tabeli 1

wersja 4.
ŻADEN rekord nie należy do rekordu z tabeli 1

Z wyniku tych testów dojodziesz gdzie jest feler.

Zadam pytanie moze nieco off topic ale może Ci to coś pomoże:

  • czemu nie zastosujesz połaczenia z normalną bazą danych?
    Wiem, że się uczysz. Ja też w ramach nauki musiałem zrobić relacyjną bazę danych bez użycia silnika bazy danych.
    No i zrobiłem - budując własny silnik bazy danych :)

Pozdrawiam.

0

Witam

W DM (Data Module) przy uzyciu komponentów advantaego do obsługi baz dbf podpinam i otwieram bazy danych.

Niestety na wstępie nauki delphi jestem zmuszony oprogramować bazy dbf :-(

A dopiero potem moge się uczyć np na bazach mssql .

0

Nie chce mi się nawet tego oglądać ale powaliło mnie ciekawe połączenie typów, to działa?
DM.rob.FieldByName('data_z_s').AsDateTime := DM.dane.Fieldbyname ('data_s').AsCurrency;

0
pytek napisał(a)

Nie chce mi się nawet tego oglądać ale powaliło mnie ciekawe połączenie typów, to działa?
DM.rob.FieldByName('data_z_s').AsDateTime := DM.dane.Fieldbyname ('data_s').AsCurrency;

To nie są TYPY, zauważ, że to sa pola obiektu.
Programując w C można żąglowac do woli i mnie to nie dziwi. Delphi wymaga aby typy były zgodne - zatem skoro się koledze kompiluje to muszą być zgodne.

0

Witam

Faktycznie to połaczenie to błąd ale o dziwo działało

0

Witam.

Jezeli masz relacje master-detail pomiedzy tabela ROB (master) a PRAC ( detail) to powinienes ustawic:

DM.prac.MasterSource:= DM.DSRob;

a Ty ustawiasz na DM.DSDane.

Poza tym cos tam straszliwie mieszasz z tymi przypisaniami. Zacznij od banalnie prostego przykladu z uzyciem dwoch tabel, przetestuj czy na dwoch tabelach dziala Ci master - detail a pozniej dopiero baw sie z jakims kopiowaniem wartosci (choc nie wiem po co).
Niepotrzebnie komplikujesz sobie sprawe od samego poczatku.

0

Witam

Co ciekawie ustawiam relacje pomiedzy tabelami tak ja w podanej procedurze przy wywoływaniu formy z DBgridami i wszystko jest OK.

Ta procedurka jest mi potrzebna do tworzenia raportu.

W mojej aplikacji używam relacji parokrotnie przy wyświetlaniu danych w Gridach i tam działa bez problemu.

Oczywiście tworząc dane do raportu tzn wypełniając tabele robocza rob.dbf moge zamist relacji wykonac to poprzez dwie petle na bazie dane i drugą na bazie prac ale wówczas znacznie wydłuża to czas wykonania raportu tym bardziej iz jedna z baz ma 200 tyś rekordów

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