Jak zrobic edycje faktury

0

Witam.
Tworze sobie programik handlowy i zastanawia mnie jak zrobić edycje faktury a dokładnie pozycji na fakturze. Mam w bazie danych tabele z nagłowkami i tabelę z pozycjami. Wybieramy sobie fakture, wczytują sie wszystkie dane do ListView czy tam StringGrida, dodaje sobie coś albo usuwam i....no właśnie ,tu zaczyna się problem bo chciałbym żeby np dodając coś do faktury stan w magazynie zmieniał się. zrobiłem sobie to tak że np dodam towar do faktury, i zapisuje - to program usuwa mi wszystko co bylo na fakturze i zapisuje od nowa. Jednak to rozwiązanie jest beznadziejne jesli chodzi o edycje tych ilości w magazynie gdyż wtedy leci mi wszystko po kolei co mam na fakturze a nie tylko to co zmieniłem. Czy ktoś robił już coś takiego albo ma jakieś pomysły??:) no i nie zadowala mnie sprawa edycji podczas dodawania danych do ListView, wszystko ma się zrobić po wcisnięciu przycisku Zapisz:D Dodam ze baze mam w MySql a program w Builder C++. Pozdrawiam.

0

Przy każdym wierszu zanotuj Id pozycji na fakturze, oraz zachowaj ilość która była przy wczytywaniu.
Po zapisz zapisuj tylko te pozycji przy których Id=0 czyli powstali podczas edycji, oraz modyfikuj te w których różni się ilość.

0

Nie do końca rozumiem a raczej nie wiem jak to zaprogramować.Mam w bazie Id_pozycji dokumentu(chyba,że nie o to chodzi)tylko że one tworzą sie automatycznie.

W pozycjach dokumentów w tabeli mam cos takiego:
Id_pozycji(auto_increment)
Id_produktu
Id_dokumentu
ilosc
...

No i wypisuje wszystko po Id_dokumentu...Jak oprogramować to, żeby program wiedział ze dodałem nowa pozycje, albo usunąłem??
Hmm...mam nadzieje ze w miarę jasno opisałem.

0

Rozumiem że nie masz problemu przy tworzeniu nowej faktury, bo wszystko jest zapisywane jak leci.
Problem się pojawia kiedy tą fakturę zaczynasz edytować.
Wiec kiedy wczytujesz fakturę aby ją pokazać użytkownikowi aby zdecydował się jak ją chce zmienić wczytaj również Id_pozycji przy każdym rekordzie.
Jeżeli użytkownik dodaje nową pozycje to ustaw dla tego rekordu Id_pozycji = 0 (dopóki nie zapisze do bazy).
Podczas zapisu, nowe rekordy mają Id_pozycji=0 zaś te które już byli w bazie mają Id_pozycji>0.

0

Dziękuję bardzo za pomoc:) udało mi się zrobić edycje dodając coś do faktury, według Twojego sposobu:) jednak wiekszy problem jest z usuwaniem, gdyż wtedy po prostu w ListView nie ma tego i nie mam sie do czego odnieść...chyba będzie z tym więcej pracy wiec myślę czy jednak nie zrobić tego już w trakcie usuwania z ListView. Może jakieś pomysły jeszcze??

0

Nie usuwaj rekordu natychmiast, narysuj tylko go czcionką z przekreśleniem, albo na szaro aby pokazać że ma być usunięty. Bo może użytkownik jeszcze się rozmyśli z tym usuwaniem. Wewnątrz tego ListView w dodatkowej niewidocznej kolumnie zaznacz że ma być usunięty, lub jego Id zmień na ujemny aby zaznaczyć to samo.

0

Ok. Działa jak należy. Mam tylko problem właśnie z zaznaczeniem, a raczej wyróżnieniem wiersza w ListView. Może wiesz jak go "podświetlić" na jakiś kolor lub zmienić kolor czcionki? Jeszcze raz bardzo dziękuje za pomoc:)

0

Kontrolka ma zdarzenia:
OnCustomDrawItem
OnCustomDrawSubItem
wystarczy że zmienisz ListView->Canvas->Font->*
Uwaga, jeżeli nic nie zmienisz to będą te same ustawienia co w poprzedniej komórce, aby to zmienić wywołaj:
if(Assigned(ListView->Canvas->Font->OnChange)) ListView->Canvas->Font->OnChange(0);

0

Hej, ostatnio nie miałem czasu żeby posiedzieć nad programem dlatego dopiero pisze i mam kolejne pytanie. Wiesz może jak zrobić usuwanie tych wierszy z ListView dla których np w kolumnie 7 jest wartosc -2, chodzi mi o samo odwołanie sie do ListView.Mam coś takiego..

 for (i = 0; i< Form1->ListView1->Items->Count ; i++)
{
if(Form1->ListView1->Items->Item[i]->SubItems->Strings[7] < 0 )
{
ListView1->Items->Delete....?

Ogólnie nie wiem czy dobrze myśle...ale próboje coś wymyślić..

Pozdrawiam.

0

pętla MUSI być od Count - 1 do 0
i dlaczego sprawdzasz Strings[7] < 0 a piszesz w kolumnie 7 jest wartosc -2??

0

Ok, mam te count -1, w subitem 7 mam -2, które chce usunąć. To ma jakieś znaczenie czy sprawdzam liczby mniejsze od zera czy równe -2?? Ogólnie działa mi to teraz...ale nie tak jak powinno. Mam to mniej więcej tak

for (i = 0; ilosc < Form1->ListView1->Items->Count -1 ; i++)
{
 if(Form1->ListView1->Items->Item[i]->SubItems->Strings[7] == -2 )
{

  ListView1->Items->Item[i]->Delete();
}
}

wciąz chodzi o te faktury, chce to zrobic tak ze leci po kolei itemy. Jesli w Subitem 7 jest 0 to dodaje mi ilosc, jesli -2 to odejmuje i usuwa z faktury a jesli wieksze od zera to zostawia tak jak jest. No i to co jest wyżej działa, ale czasem sie dziwnie zachowuje bo np usuwam 2 pozycje, to jest ok, ale usune np 5 to usuwa mi tylko 3 , usune 10 to usunie 9....nie ma to stałej reguły. Być może mam jakiś bład w reszcie kodu..

0

if(Form1->ListView1->Items->Item[i]->SubItems->Strings[6] < 0 ) // 6 - > kolumna 7
poza tym wydaje mi się że możesz to zapisać również tak:
if(Form1->ListView1->Items[i]->SubItems[6] < 0 ) // 6 - > kolumna 7
oprócz tego rób to nie w funkcji zaś w metodzie tej Form1 a wtedy:
if(ListView1->Items[i]->SubItems[6] < 0 ) // 6 - > kolumna 7

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