Dodanie wierszy do tabeli MySQL

0

Witam, mam 2 tabele w mysql, w pierwszej mam wykaz prac serwisowych, w drugiej chce tworzyć rozliczenie pracy. Nie za bardzo wiem jak to ogarnąć. Stworzyłem formularz na którym są pola Edit ( nr zlecenia, datę, nazwe, technika) oraz jedno pole Grid. Chce aby go grid- a można było dodać kilka pracy serwisowych z pierwszej tabeli dopisać pola czas i uwagi. I całość wysłać do drugiej tabeli. Rozumiem że powinno to wyglądać tak: zostanie zapisanych jednocześnie kilka wierszy które będą zawierały identyczne dane z editów oraz poszczególne dane z grida. Nie wiem też jak ugryźć wyszukiwanie prac serwisowych z tabeli pierwszej przed wstawieniem ich do grida.

Bardzo proszę o jakąś podpowiedz ewentualnie kawałek kodu.

0
  1. Proszę przedstaw struktury tych tabel.
  2. W jaki sposób łączysz się z MySQL ( czy używasz komponentów i kontrolek bazodanowych ).
  3. A najlepiej wrzuć kod programu, który piszesz żeby było wiadomo co już masz.
0

Witaj, a wiec: używam komponentów zeoslib do łączenia z bazą.
ZConnection
Query
DataSource

w query mam selekta co wyświetla mi w dbgrid wszystkie pola z tabeli wykazprac (id, nazwa, detale) dodawanie kolejnych wierszy jest bezpośrednio w gridzie.
dodatkowo mam tabele zleceniaserwisowe ( kolumny: id, numer_zlecenia, data zlecenia, wykazprac_id, czas, uwagi) dla tej kolumny kolejny Query -> select wraz z INNER JOIN zmieniajacy wykazprac_id na nazwe.

Kombinowałem tak żeby po zaznaczeniu wiersza i naciśnięciu Buttona dodawany był nowy wiersz do stringgrida po dodaniu kilku wierszy if-em wpisać po kolei wiersze do bazy zraz z czasem i uwagami, oraz z editów nr_zlecenia i data_zlecenia.

Nie wiem chyba ze to jest z Wrocławia do Krakowa przez Gdańsk.

0

Czytałem oba Twoje posty po 3 razy i naprawdę się mocno skupiałem ale NIE MA szans zrozumieć co masz na myśli - widzę tylko zbiór chaotycznych myśli lęgnących się jedna po drugiej...
Nie ma łady, nie ma składu.
Pokaż formatkę, pokaż kod, generalnie pokaż jak najwięcej bo tu nie ma jasnowidzów. Piszesz o jakimś zapytaniu ale go nie pokazujesz, piszesz o kopiowaniu wszystkiego z jednej tabeli do drugiej (można było dodać kilka pracy serwisowych z pierwszej tabeli dopisać pola czas i uwagi. I całość wysłać do drugiej tabeli) a tymczasem ani jedno pole z pierwszej tabeli nie występuje w drugiej :-)

Uporządkuj zapytanie a na pewno uda się rozwiązać problem.
W chwili obecnej wiem tylko, że "Kombinowałeś i nie za bardzo wiesz jak to ogarnąć".

0

OK to może inaczej bo też będę potrzebował mały magazyn dopisać.
Mam następujace tabele

produkty

"id" INT +AI
"nazwa" VARCHAR [100]
"opis" LONGTEXT
"minimum w magazynie" DECIMAL [4,0]

dostawy

"id" INT +AI
"Rachunek_nr " VARCHAR [25]
"Data_dostawy" DATE
"Dostawca" VARCHAR [100]
"produkty_id" INT[11]
"ilosc" DECIMAL [6,0]

i chodzi mi o formularz który do tabeli dostawy będzie tworzyć wpisy 'ala' PZ przyjecie do magazynu zawierające datę , nr_rachunku, nazwę dostawcy oraz kilka pozycji z produktami i ilością

I teraz
mam na formie pola EDIT: Rachunek_nr, Data_dostawy, Nazwa_dostwacy
oraz nie wiem jak dopisywać produkty z tabeli produkty

tak aby uzyskać takie wpisy

1   Rachunek1    wczoraj   Sklep1    Produkt 1   Ilość A
2   Rachunek1    wczoraj   Sklep1    Produkt 2   Ilość B
3   Rachunek1    wczoraj   Sklep1    Produkt 3   Ilość C
4   Rachunek2    dzisiaj   Sklep4    Produkt 1   Ilość X
5   Rachunek2    dzisiaj   Sklep4    Produkt 5   Ilość Y
6   Rachunek2    dzisiaj   Sklep4    Produkt 9   Ilość Z
7   Rachunek3    dzisiaj   Sklep6    Produkt 1   Ilość V

kombinuje tak ze do StringGrida bede dodawał poszczególne produkty i ilość

procedure TForm1.Button2Click(Sender: TObject);
begin
   StringGrid1.FixedRows:=1;
   StringGrid1.FixedCols:=1;

        with StringGrid1 do
           begin
            StringGrid1.RowCount:= rc+2;
            Cells[0, rc+1]:= IntToStr(rc+1);
            Cells[1, rc+1]:= DBComboBox1.Text;     // produkt_id
            Cells[2, rc+1]:= DBComboBox2.Text;     // produkt nazwa
            Cells[3, rc+1]:= Edit1.Text;                     // ilość 
            rc:= rc + 1;
            end;
end;

end.  

i to mi działa.

następnie trzeba by to dodać do tabeli myślałem nad czymś takim jeszcze nie testowałem

procedure TForm1.BTN_Dodaj(Sender: TObject);
   begin
            for i := 1 to rc do begin
            INSERT INTO dostawi (Rachunek_nr, Data_dostawy, Dostawca, produkty_id, ilość )
VALUES (EDIT1.TEXT, EDIT2.TEXT, EDIT3.TEXT, StringGrid1.Cells[2,rc];StringGrid1.Cells[4,rc];);
           rc = rc -1;
       end;
       rc:= 0;
       StringGrid1.Clean;
end;
0

Tak myślę że powinienem to chyba rozbić i dodać jeszcze 1 tabele
np:
dostawy
"id" INT +AI
"Rachunek_nr " VARCHAR [25]
"Data_dostawy" DATE
"Dostawca" VARCHAR [100]

oraz np
produkty_dostawa
"id" INT +AI
"dostawy_id" INT[11]
"produkty_id" INT[11]
"ilosc" DECIMAL [6,0]

takie rozwiązanie pozwoli mi to na aby w DBgridzie wyświetlać liste dostaw a następnie w 2 DBgridzie wyświetlać dostarczone produkty dla poszczególnego wiersza

1

Raczej powinieneś to zaprojektować w ten sposób:
ErdSample.png

Gdzie:

  • tIvItem to kartoteka pozycji, a więc przechowuje wszystkie informacje o towarze/produkcie/usłudze...
  • tDocHdr to nagłówek dokumentów. Jaki to jest dokument (czyli PZ, WZ, MM, zlecenie serwisowe, itd.) określasz wartością w polu DocType
  • tDocLine to pozycje dokumentu.
    Każdy dokument może mieć nieograniczoną ilość takich pozycji.
    Każda pozycja wiążę się z kartoteką pozycji przez wartość w polu IdIvItem
    Każda pozycja jest związana z nagłówkiem dokumentu przez wartość w polu IdDocHdr

W efekcie czego może wyglądać to tak:
Sample01a.png

Gdzie:

  1. To jest nagłówek dokumentu czyli generalnie zawartość tabeli tDocHdr
  2. To są pozycje dokumentu czyli generalnie zawartość tabeli tDocLine
0

Kolego "wloochacz", dzieki za odpowiedź generalnie sam już wydedukowałem to co napisałeś w ostatnim poście , U mnie podzielone to jest na 3 tabele tzn.** produkty **w której przechowuje nazwę kod produktu, kod kreskowy, idt Twoje tIvItem, . Następnie tabele dostawy odpowiednik tDocHdr oraz tabele produkty_dostawa odpowiednik tDocLine.
Pytanie jak to powiązać razem. Kombinuje w ten sposób że
Po naciśnięciu **button - zapisz_dostawę **wykonuję następująco
zapytanie mysql insert into dostawy wiersz zawierający szczegóły dostawy. i zwracający nam id nowo dodanego wiersza który przechowuję jako zmienną .
następnie w pętli odczytuję kolejne wiersze z grida gdzie mam ID_produkty , Ilość, oraz dodaje id_dostawy przechowywane w zmiennej za pomocą zapytania mysql insert into do tabeli produkty_dostawa . Chyba że są jakieś lepsze sposoby.
Interesowało by mnie tez w jaki sposób obsłużyć takie nr zamówień jak w Twoim przykładzie oraz to jak dodajesz produkty, do pozycji dokumentu.
Pozdrawiam serdecznie

0
pk.gorny napisał(a):

Kolego "wloochacz", dzieki za odpowiedź generalnie sam już wydedukowałem to co napisałeś w ostatnim poście , U mnie podzielone to jest na 3 tabele tzn.** produkty **w której przechowuje nazwę kod produktu, kod kreskowy, idt Twoje tIvItem, . Następnie tabele dostawy odpowiednik tDocHdr oraz tabele produkty_dostawa odpowiednik tDocLine.

Na cholerę Ci tabela dostawy?
Dostawa jest opisana dokumentem o odpowiednim typie.
Tyle.

Żeby było śmieszniej, to już o to pytałeś i dostałeś praktycznie identyczną odpowiedź od @abrakadaber o tu:
Django - prosty magazyn cześci

Pytanie jak to powiązać razem. Kombinuje w ten sposób że

Masz powyżej gotowy diagram ERD.

Po naciśnięciu **button - zapisz_dostawę **wykonuję następująco
zapytanie mysql insert into dostawy wiersz zawierający szczegóły dostawy. i zwracający nam id nowo dodanego wiersza który przechowuję jako zmienną .
następnie w pętli odczytuję kolejne wiersze z grida gdzie mam ID_produkty , Ilość, oraz dodaje id_dostawy przechowywane w zmiennej za pomocą zapytania mysql insert into do tabeli produkty_dostawa . Chyba że są jakieś lepsze sposoby.

Łooo Panie...
To są podstawy, ale mnie w ogóle żadne grid nie interesuje.
Takie rzeczy robi się na poziomie danych, a nie kontrolek do ich prezentacji.

Interesowało by mnie tez w jaki sposób obsłużyć takie nr zamówień

Eee... to pokręcone, nie chce mi się nawet tłumaczyć (można by na ten temat pracę inżynierską napisać), ale w skrócie:

  1. Mam definicję numerów połączoną z typami i seriami dokumentów wszelakich
  2. Metadane obiektu biznesowego zawierają informację o tym jaki to jest typ dokumentu.
  3. Framework ładuje dostępne serie dla danego typu dokumentu
  4. User wybiera serię
  5. System generuje numer na podstawie wybranej serii dokumentu, ale robi to dokładnie przed zapisem dokumentu.
    Ja sobie to oprogramowałem przez rejestrację customowej funkcji do preprocesora FireDAC, której używam jako default value, ale z moim oprogramowaniem wywołania tego w trybie "przed zapisem do bazy danych".
    Zawsze korzystam z trybu CachedUpdates, zatem przed zapisem do bazy danych to nie jest przed wykonaniem metody Post dla DataSetu.
    Tym całym bałaganem zajmuje się tzw. DSController, czyli dedykowana klasa zarządzającą całym zestawem danych dla danego obiektu biznesowego.

jak w Twoim przykładzie oraz to jak dodajesz produkty, do pozycji dokumentu.

Tak dodaję produkty do dokumentu:
dfSampleAddDoc01.gif

Ale pewnie nie o to chodziło :D

0

Witaj, wiem o co Ci chodzi: zmieniam nazwę tabeli dostawy na dokumenty i dodaje kolumnę dokumentTyp. Bardziej mi chodzi jak zorganizować formularz da takiego dokumentu. Jestem totalnym amatorem każdy wieczór lub weckend przed komputerem uczy mnie coś nowego. A że jestem w grupie 40+ więc nie idzie już tak łatwo.(Wiem też że rzucam się z motyką na księżyc , ale taka farma nauki jest dla mnie najlepsza postawić wysoko poprzeczkę i znaleźć rozwiązanie )

U ciebie widzę jakiegoś Grida w którym jest ComboBox z pozycjami dokumentu i filtrowaniem. Bardzo mi się to podoba. Jednak mnie interesuje co się dzieje z danymi po ich wybraniu ( nie wiem w jaki sposób są buforowane oraz co się z mini dzieje przed i po kliknięciu buttona Zapisz W jaki sposób i w jakiej kolejności zapełniane są tabele.

0
pk.gorny napisał(a):

Witaj, wiem o co Ci chodzi: zmieniam nazwę tabeli dostawy na dokumenty i dodaje kolumnę dokumentTyp. Bardziej mi chodzi jak zorganizować formularz da takiego dokumentu.

Dokładnie tak, to typ determinuje czy jest to np. dostawa , wydanie czy przyjecie.
A dokładniej, to są dwie wartości:

  • typ
    Określa ogólny rodzaj dokumentu, np. dokument dostawy.
  • seria
    Określa grupę dokumentów jednego typu. A więc możesz mieć np. wiele serii (rejestrów) dokumentów dostaw. np. osobno dla dokumentów dostaw z kraj i z zagranicy. Albo jakkolwiek chcesz.
    Ważne jest to, że typ i seria ma swój wyróżnik (co pozwala rozróżniać dokumenty, grupować, filtrować, itd.) oraz że to seria determinuje formę numeracji. A więc każda seria może mieć osobny numerator dokumentów.

Unikalność dokumentu jest na poziomie trzech wartości: typ, seria i numer dokumentu.
I nie, nie jest to złożony klucz podstawowy (jestem ich zdeklarowanym przeciwnikiem).

Jestem totalnym amatorem każdy wieczór lub weckend przed komputerem uczy mnie coś nowego.

Co to jest "weckend"? :P

No cóż, to nie jest rozwiązanie amatorskie.
Generalnie zawsze miałem problem z rozwiązaniami prostymi, takimi które działają i związanymi na drut, dla mnie to było zawsze nie to.
Być może to wynika z zespołu natręctw, a może raczej z tego, że nigdy nie pracowałem jako wyrobnik w korpo.
Innymi słowy - z kodem który napiszę, to ja będę miał problemy.
Zatem lepiej to zrobić raz, a dobrze.

A że jestem w grupie 40+ więc nie idzie już tak łatwo.(Wiem też że rzucam się z motyką na księżyc , ale taka farma nauki jest dla mnie najlepsza postawić wysoko poprzeczkę i znaleźć rozwiązanie )

Podobnie jak i ja. I co z tego?

U ciebie widzę jakiegoś Grida w którym jest ComboBox z pozycjami dokumentu i filtrowaniem. Bardzo mi się to podoba. Jednak mnie interesuje co się dzieje z danymi po ich wybraniu ( nie wiem w jaki sposób są buforowane oraz co się z mini dzieje przed i po kliknięciu buttona Zapisz W jaki sposób i w jakiej kolejności zapełniane są tabele.

  • No grid, a dokładnie TCxGrid z DevExpress, ale to nieistotne.
  • Ten ComboBox to własna implementacja na bazie TCxLookupComboBoxProperties (a to oznacza, że dokładnie ten sam kod działa jako kontrolka osadzona w gridzie i jako samodzielna kontrolka), ba żadna z istniejących rozwiązań nie potrafi filtrować danych na liście wybory tak jak pokazałem. Po kawałku, wyszukując wszystko co się da na bazie wielofrazowego wyrażenia w formie przyrostowej w trakcie pisania.
  • Dane dla list wyborów są oczywiście buforowane. Zarządza tym dedykowana ogólna usługa mojego systemu. Dane na listach wyborów są singletonem (tj. dane występują raz w pamięci dla dowolnej liczby aktywnych list wyborów tego samego rodzaju jak np. towar na różnych formularzach/gridach) co pozwala nimi zarządzać w sposób scentralizowany - np. automatycznie odświeżać te dane po zmianie danych źródłowych przez innych użytkowników. Poza tym, to dla mnie bardzo istotne bo UI systemu nie jest zbudowane na ShowModal i można sobie otworzyć wiele różnych formularzy równocześnie lub wiele instancji tego samego formularza i nic nie ma prawa się blokować lub zmieniać niezgodnie z oczekiwaniami.
  • Dowolna edycja/usuwanie/dodanie dowolnych danych na formularzu jest buforowana, tj. nie dotykamy bazy danych w ogóle. Tak naprawdę to nie posługuję się pojęciem formularz, ponieważ on jest dla mnie nieistotny w momencie zarządzania danymi. Formularz tylko prezentuje dane i żadna logika nie opiera się na kontrolkach. Same dane to jest zestaw DataSetów; w omawianym przypadku będą minimum dwa - jeden dla nagłówka dokumentu, a drugi dla pozycji. Pozycje z nagłówkiem oczywiście są połączone relacją master-detail.
  • Te wszystkie kontrolki są dbAware (a więc nie TStringGrid tylko TDBGrid, TDBEdit itd.), a więc połączenie pomiędzy danymi w DataSet a kontrolką są automatyczne.
  • Kod posługują się tylko i wyłącznie danymi, kontrolki je automatycznie wizualizują. Oczywiście to jest standard dla Delphi i nic nie trzeba specjalnego robić.
  • Wszystkimi datasetami zarządza klasa DSController i to ona odpowiada za zapis, odczyt, usuwanie danych itd. Tam jest istotne pojęcia, które nazywam RootDS - to jest nadrzędne źródło danych dla danego zestawu. A taki zestaw reprezentuje konkretny dokument.
  • Zapis jest w kierunku od RootDS do ostatniego w hierarchii (a więc najpierw zapisywany jest RootDS (a więc master, czyli nagłówek), potem detail (czyli pozycje) itd.)
  • Usuwanie danych co do zasady jest w kierunku odwrotnym, aczkolwiek najczęściej zarządza tym sama baz danych - klucze obce z kaskadowym usuwaniem danych.

OK, starczy, bo to dla Ciebie niewiele wnosi.
Jednakże... jest pomysł na projekt eksperymentalno-edukacyjny w tym obszarze (Delphi, bazy danych).
Coś tam zaczęliśmy robić, ale problemem jest mój brak czasu na wszystko.
Ale jak coś się uda zrobić, to dam znać, ponieważ tam mają być gotowe recepty na takie pytania :)

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