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;

Arkady_pl
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 8 lat
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;

Arkady_pl
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 8 lat
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

Wodzu
  • Rejestracja:około 23 lata
  • Ostatnio:około 10 lat
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.


"as above, so below..all things come from the one. Now You are the victim, carried by the wind, then rooted to the ground. If You want, to learn the secrets..close Your eyes..."
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.