Search  
Saturday, February 11, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Visual FoxPro in general  Atestat 2010...
 Re: Atestat 2010
 
 3/1/2010 8:57:32 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 2010
 (N/A)
k am inteles .

Pey avem :

Adaugare : in primul rand va trebui sa cautam in lista de autori daca exista autorul cu un anumit nume ...daca exista se afiseaza un mesaj daca nu exista se va trece la adaugarea lui .
Cautarea ....hmm ...ma gandeam ca se va face cu comenzile care le-am folosit pana acum . Vom cauta cate intrari returneaza dupa un nume , daca returneaza 0 autorul nu exista si trebuie adaugat , daca returneaza 1 inseamna ca autorul este deja inregistrat , iar daca se afiseaza mai multe inseamna ca filtrul nu este complet .
comanda...hmm :

lcText="Ion Luca Caragiale"

? GETWORDCOUNT(lcText)

FOR lni=1 TO GETWORDCOUNT(lcText)
? GETWORDNUM(lcText,lni)
NEXT
lcWhere='WHERE '
lnCuvinte=GETWORDCOUNT(lctext)
FOR lni=1 TO lnCuvinte
    lcCuvant=GETWORDNUM(lctext,lni)
    lcWhere=lcWhere+"UPPER("+lcWord+")$UPPER(nume) "
   *** Aici trebuie sa punem AND, dar numai daca nu este ultimul cuvant din sir
   IF lni< lnCuvinte
      lcWhere=lcWhere+" AND "
  ENDIF
ENDFOR

? lcWhere
lcSQL="SELECT * FROM autori "+lcWhere
? lcSQL
&lcSQL
 SELECT IDautor FROM autori WHERE UPPER(lctext)$UPPER(nume) INTO CURSOR crsCarte
IF crsCarte = 1
   ?('Autorul exista in baza de date')
ENDIF

sper ca nu am scris o prostie prea mare :(


 3/1/2010 9:29:47 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A)
Codul e corect, dar nu la asta ma refeream.
Acum suntem la partea de interfata.
Cum se va lucra cu aplicatia?
Avem de facut adaugare, modificare, eventuala renuntare la adaugarea sau modificarea inceputa, stergerea unei inregistrari.
Cum punem la dispozitia utilizatorului aceste functii?
Cam cum ne organizam in form cu controalele de care avem nevoie? (Lista, textbox-urile, butoanele ...)



Daniel Buduru
 3/1/2010 10:15:14 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 2010
 (N/A)
ma gandeam la meniuri si submeniuri :

Adaugare : Autor | Abonament | Carte | Imprumut
Modificare : Autor | Abonament | Carte | Imprumut
Stergere : Autor | Abonament | Carte | Imprumut

Adaugare autor - text box unde se va tasta numele autorului si un butor de actionare
adaugare abonament - 2 -textbox-uri ( nume , clasa ) si un buton
adaugare carte - 10 -textbox-uri    si un buton
adaugare imprumut - 5 -textbox-uri  si un buton
 3/1/2010 10:42:43 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A)
Si fiecare bar din menu ar deschide o forma?
Deci cate o 3 forme pentru fiecare tabela?


Daniel Buduru
 3/1/2010 10:42:59 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A)
Si fiecare bar din menu ar deschide o forma?
Deci cate 3 forme pentru fiecare tabela?


Daniel Buduru
 3/1/2010 11:53:56 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A)
Cum ar fi sa ai cate o forma pentru fiecare tabela - autori, carti, abonati, imprumuturi, si pe fiecare form butoane pentru adaugare / modificare/ eliminare ?


Daniel Buduru
 3/2/2010 6:21:02 AM
User is offlineGooDy
194 posts
5th


Re: Atestat 2010
 (N/A)
m-am gandit si asa , dar cand se va apasa butonul Adaugare nu se va deschide alt form ? ca sa se poate introduce numele autorului ...sau modificaree.
 3/2/2010 8:57:42 AM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A)
De ce ar fi nevoie de alt form? Textbox-urile pot sta pe form, se afiseaza in ele campurile din tabela, dar sunt inhibate, nu se pot face modificari,
Cand se apasa butonul Modificare, se activeaza textboxurile (si se dezactiveaza lista, ca sa nu se mai schimbe inregistrarea).


Daniel Buduru
 3/2/2010 11:01:56 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 2010
 (N/A)
ok , am inteles ce ai vrut sa spui . M-am gandit sa arate asa :

Prezentare
Adaugare : Autor | Abonament | Carte | Imprumut
Modificare : Autor | Abonament | Carte | Imprumut
Stergere : Autor | Abonament | Carte | Imprumut

Iesire : VFP | Sistem

acestea sunt meniurile si submeniurile
 3/2/2010 11:47:33 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A) Modified By Daniel Buduru  on 3/2/2010 11:49:19 PM)
Eu ma gandeam la cate un form pentru autori, carti, abonati si imprumuturi.
Pe fiecare form, butoane de adaugare / modificare /stergere / salvare / revocare / iesire.
In menu poti pune orice prompt care sa apeleze unul dintre aceste formuri.

Desigur, poti face cele 12 formuri pe care le-ai enumerat, mie insa mi se pare cam mult de munca si destul de incomod pentru utilizator.

Daniel Buduru
 3/3/2010 2:19:20 AM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A) Modified By Daniel Buduru  on 3/3/2010 8:50:21 PM)
Continuam pe varianta cu adaugare, modificare, stergere pe acelasi form.

Modificam codul din List1.InteractiveChange ca sa arate astfel :

STORE (this.Value) TO (This.ControlSource)
thisform.OnListChange

Comanda STORE (this.Value) TO (This.ControlSource)  pune valoarea lin List1.value in variabila sau campul specificat in list1.ControlSource, astfel incat sa compenseze decalajul intre declansarea evenimentului InteractiveChange si transferarea valorii in ControlSource
 
Adaugam formului niste metode, pentru modificare, stergere, salvare, revocare
Astfel adaugam metodele :
OkToSave
OnEdit
Ondelete
OnSave
OnRevert

Apoi adaugam doua proprietati:
lEdit=.F.
lAdd=.F.

Facem setarile de context in metoda Load a formului:
SET DELETED ON
SET MULTI ON
SET ANSI ON
SET EXACT OFF
SET DATE DMY
SET CENTURY ON
SET HOURS TO 24
SET TALK OFF
SET NOTIFY OFF


Apoi punem pe form un buton (commandbutton)
Il plasam in partea dreapta, sus, la 2-3 mm de la marginea din dreapta a formului
Click dreapta pe buton, properties
Caption: Adaugare
Name: cmdAdd

Adaugam cod in metodele acestui buton:
-in metoda Click:
Thisform.OnEdit(.t.)
-in Refresh
THIS.Enabled= Not Thisform.lEdit

Adaugam un alt buton, imediat sub el, aliniat pe verticala
Caption: Modificare
Name: cmdEdit
- in Click:
Thisform.OnEdit
- in Refresh
This.Enabled= Not Thisform.lEdit

Urmatorul buton, sub cmdEdit
Caption: Stergere
Name: cmdDelete
in Click:
Thisform.OnDelete
in Refresh:
This.Enabled= Not Thisform.lEdit

Urmatorul buton, sub cmdDelete
Caption: Salvare
Name: cmdSave
in Click:
Thisform.OnSave
in Refresh:
This.Enabled= Thisform.lEdit

Urmatorul buton, sub cmdSave
Caption: Revocare
Name: cmdRevert
in Click:
Thisform.OnRevert
in Refresh:
This.Enabled= Thisform.lEdit

Ultimul buton:
Caption: Iesire
Name: cmdExit
in Click:
Thisform.release
in Refresh:
This.Enabled= Not Thisform.lEdit


Formul ar trebui sa aiba in stanga lista, in dreapta butoanele, iar intre ele textboxul.
Nu mai stiu daca am pus si un label.
Daca nu, punem un label la stanga textbox-ului
Caption: Autor:
Backstyle: 0 - Transparent

Punem cod in metoda Refresh a listei:
THIS.Enabled=NOT thisform.lEdit

Punem cod si in metoda Refresh a textbox-ului
This.Enabled=Thisform.lEdit

Punem cod in metodele formului:
Incepem cu metoda OnEdit, apelata atat la adaugare cat si la modificare.
Cand am apelat-o din butonul cmdAdd, am apelat-o cu un parametru - thisform.DoEdit(.T.)
In consecinta, pe prima linie va fi PARAMETERS sal LPARAMETERS (parametri vizibili local)
Deci

LPARAMETERS tlAdd      &&tlAdd =.T. spune ca s-a cerut o adaugare

*Generam cursorul pe care vom face modificarea sau adaugarea
SELECT * FROM autori WHERE idautor=(thisform.ListValue) INTO CURSOR crsAutor READWRITE
*Clauza READWRITE permitea crearea unui cursor actualizabil. Altfel, cursorul obtinut cu select sql este readonly

*Daca tabela autori nu are nici o inregistrare, sau filtrul nu returneaza nici o inregistrare (asta n-ar trebui sa se intample), cursorul creat nu are inregistrari si trebuie sa-i adaugam una
IF RECC('crsAutor')=0
   APPEND BLANK IN crsAutor
ENDIF

*Daca s-a cerut adaugare, ne trebuie o inregistrare goala.
IF NOT EMPTY(tlAdd)
    BLANK IN crsAutor
    Thisform.lAdd=.T.  &&Semnalam ca facem o adaugare, nu o modificare. Vom avea nevoie de aceasta informatie la salvare.
ENDIF

*Semnalam ca se trece in starea de editare. Obiectele vor trece in starea enabled sau disabled in functie de codul din refresh.
Thisform.lEdit=.T.
Thisform.refresh

Vom mai pune cod in metoda OnRevert a formului:
Thisform.lEdit=.F.
Thisform.lAdd=.F.
Thisform.OnListChange

Trecem acum la verificarea inainte de salvare. Screim codul in metoda OktoSave a formului.

LOCAL llRetval &&llRetval este o variabila locala in acre tinem valoarea pe care o va returna aceasta metoda
*Mai intai verificam daca nu cumva inregistrarea este goala.
IF EMPTY(crsAutor.Nume) 
    MESSAGEBOX('Completati autorul sau revocati',16,thisform.Caption)   &&Atentionam utilizatorul
    RETURN .f.    &&Nu continuam, nu avem ce verifica
ENDIF

*Verificam daca autorul exista in tabela.
*Construim comanda select
LOCAL lcSQL, lcWhere, lcCuvant, lcText, lcSeparator, lnArea
lnArea=SELECT()  &&Memoram zona selectata, intrucat comanda SELECT SQL selecteaza cursorul creat
lcSeparator=[,.- ]
lctext=crsAutor.Nume
lcWhere=''
FOR lni=1 TOGETWORDCOUNT(lcText,lcSeparator ) 
    lcCuvant=GETWORDNUM(lctext, lni, lcSeparator )
    lcWhere=lcWhere+"UPPER("+
lcCuvant+")$UPPER(nume) "
   *** Aici trebuie sa punem AND, dar numai daca nu este ultimul cuvant din sir
   IF lni< lnCuvinte
      lcWhere=lcWhere+" AND "
  ENDIF
ENDFOR
lcWhere=IIF(EMPTY(lcWhere),'', ' WHERE ')+lcWhere
lcSQL="SELECT * FROM autor "+lcWhere+" INTO CURSOR crsFind"

&lcSQL

IF RECC('crsFind')=0
   llRetval=.T.  &&Daca nu s-au gasit inregistrari, numele e unic si se poate trece la salvare
ELSE
   *Daca s-au gasit inregistrari si suntem in adaugare numele e duplicat
   *Daca suntem in modificare, iar idautor gasit e diferit de idautor modificat, inregistrrea e duplicata
    IF Thisform.lAdd OR crsAutor.IDAutor<>crsFind.IDAutor
        MESSAGEBOX("Inregistrare duplicata",16,thisform.Caption)
       llRetval=.F.
    ELSE
       llRetval=.T.
   ENDIF
ENDIF

SELECT(lnArea)  &&Restabilim zona care era selectata la intrarea in metoda

Return llRetval

Acum codul din metoda OnSave
*Incepem cu verificarea validitatii numelui.
IF NOT Thisform.OkToSave()
     Return .F.
ENDIF
*Acm, daca suntem in adaugare, vom face o inserare in tabela autori
LOCAL lnIDAutor
IF thisform.lAdd
    INSERT INTO autori (nume) VALUES (PROPER(crsAutor.Nume))   &&Functia Proper pune majuscula la inceputul cuvantului, iar in rest litere mici
    *Trebuie sa preluam noul idautor, ca sa pozitionam lista pe noua inregistrare
    lnIDAutor=GETAUTOINC(Thisform.DatsessionID)  
ELSE
   lnIDAutor=crsAutor.IDAutor
   UPDATE Autori SET nume=PROPER(crsAutor.nume) WHERE IDAutor=lnIDAutor
ENDIF

Thisform.lAdd=.F.
Thisform.lEdit=.F.   &&Am incheiat cu adaugarea/modificarea
Thisform.List1.Requery()   &&Lista isi reciteste sursa
Thisform.List1.Value=lnIDAutor
Thsiform.Refresh

Metoda OnDelete
*O inregistrare poate fi eliminata din tabela autori numai daca nu exista carti de acest autor in tabela carti.
*Verificam existenta idautor in carti
LOCAL lnArea, lnIDAutor, lnIndex
lnIDAutor=CAST(Thisform.ListValue as int)
lnArea=SELECT()
SELECT * FROM carti WHERE idautor=lnIDautor INTO CURSOR crsFind
SELECT (lnArea)
IF RECC('crsFind')>0
    MESSAGEBOX('Inregistrarea nu poate fi eliminata',16,thisform.caption+' Stergere')
    Return .F.
ENDIF
DELETE FROM autori WHERE idautor=lnIDautor
lnIndex=Thisform.list1.listIndex  &&Memoram linia din lista pentru a reveni in aceeasi pozitie
Thisform.list1.Requery()
Thisform.List1.ListIndex=MAX(Thisform.:ist1.ListIndex,lnIndex)
Thisform.refresh


Sper sa nu fie prea multe erori prin cod.
Daca sunt, e o ocazie sa folosesti debugger-ul.


Daniel Buduru
 3/3/2010 7:37:53 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 2010
 (N/A)
am existat mici erori de tastare , dar am reusit sa le rezolv :)
treaba sta cam asa :

apas adaugare ....se dezactiveaza tot si se activeaza textbox-ul si butoanele salvare si
revocare

dar daca vreau sa introduc un nume in text box imi da o eroare si spune : Property List
index is not found ....(problema este din : Text1.interactivchange )
cand ii dau revocare mi se dezactiveaza Textbox-ul.

selectez un nume , apas modificare ....se activeaza textbox-ul cu numele autorului dar cand
incerc sa adaug ceva :  Property List
index is not found ....(problema este din : Text1.interactivchange )

butonul de stergere functioneaza perfect ... imi sterge doar autorii care nu au carti introduse

si butonul de iesire functioneaza .
 3/3/2010 7:51:11 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A) Modified By Daniel Buduru  on 3/3/2010 7:51:33 PM)
Sterge codul din text1.interactivechange

Cand te-am intrebat de ce timp dispui, ai zis de cateva ore zilnic. Pentru mine, zilnic era OK. In realitate insa, pauzele sunt mult mai mari.
Nu scriu nicaieri altundeva codul, de pe o zi pe alta imi aduc aminte tot ce am pus aici, dar la un interval mai mare nu mai e la fel de proaspat, avand in vedere ca nu este singurul cod pe care il scriu intr-o zi. Nici nu am suficient timp sa ma uit in urma sa vad ce cod am pus aici.
Asa ca mergem inainte asa, si depanezi erorile.
Cand va functiona curat, extragi codul cu class browser-ul si il postezi aici.

Daniel Buduru
 3/3/2010 8:44:29 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 2010
 (N/A)
Timpul este apreciat corect ,dar din pacate am avut mici probleme ( scoala | majoratu ....etc ) ... offline : exista o functie in forum ca atunci cand primesti raspuns la topicu tau sa te anunte pe mail ?

am sters condul ,nu imi mai da eroarea dar in schimb imi spune : variable LCWORD is not found ( form1.oktosave     ->      lcWhere=lcWhere+"UPPER("+lcWord+")$UPPER(nume) " )

parca am mai avut aceasta eroare mai in urma si mi-ai spus sa execut bucla for .

nu am inteles ce ai vrut sa imi spui sa fac cu class browser-ul .
 3/3/2010 8:49:52 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A) Modified By Daniel Buduru  on 3/3/2010 10:38:08 PM)
FOR lni=1 TO GETWORDCOUNT(lcText,lcSeparator ) 
    lcCuvant=GETWORDNUM(lctext, lni, lcSeparator )
    lcWhere=lcWhere+"UPPER(["+
lcCuvant+"]) $ UPPER(nume) "
   *** Aici trebuie sa punem AND, dar numai daca nu este ultimul cuvant din sir
   IF lni<
GETWORDCOUNT(lcText,lcSeparator ) 
      lcWhere=lcWhere+" AND "
  ENDIF
ENDFOR

Daniel Buduru
 3/3/2010 9:18:01 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 2010
 (N/A)
da a functionat ...acum imi da aceasi eraore o linie mai jos :

IF lni< lnCuvinte ...

am incercat cu : lncuvant | lccuvant | lccuvinte
 3/3/2010 9:22:58 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 2010
 (N/A)
Am corectat postul precedent


Daniel Buduru
 3/3/2010 9:53:36 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
am corectat dar acum imi spune : operator/operand type mismatch .

din ce am citit acesta eroare apare cand compari un obiect....nu 2 numere cum ar trebuii .Dar din ce vad eu : lni are valoare deci este un numar , iar GETWORDNUM(lctext, lni, lcSeparator ) , asta face , afiseaza un numar .
Nu inteleg care este problema lui ?
 3/3/2010 9:58:36 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Eu am fost de vina, am copiat gresit GETWORDNUM(....)  in loc de GETWORDCOUNT(...)
Am corectat corectura adineauri, probabil in timp ce scriai.
Vezi din nou postul.


Daniel Buduru
 3/3/2010 10:07:36 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
am corectat .
acum cand selectez pe Mihai Eminescu ( de exemplu ) ii dau modificare , sterg 1 litera si dau save , imi afiseaza :

SQL : Column 'Mihai' is not found .

form1.oktosave -> &lcSQL
 3/3/2010 10:39:06 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Am corectat, tot in FOR ... NEXT, postul dinainte

Daniel Buduru
 3/4/2010 7:11:03 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Corect , totul acum functioneaza ...stergere - adaugare - modificare  ( mai sunt vreo 2 erori prin cod , erori de tastare, dar le-am rectificat )

multumesc enorm pentru bataia de cap .
 3/4/2010 10:20:26 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Deschide formul in Class Browser
In menu, Tools, Class Browser
Click in toolvbar pe deschidere, se deschide dialogul de selectie fisier - implicit e pe visual class library, il treci pe Form.
Dupa ce deschizi formul in class browser, click pe form in lista din stanga, apoi clic pe View Class Code in toolbar - e butonul de la stanga binoclului.
Daca ai ajuns unde trebuie, se deschide o fereastra cu titlul viewcode.prg.
Selectezi tot si copiezi (Ctrl+A, Ctrl+C), apoi faci paste aici pe forum.

Ai un form care adauga, modifica, salveaza, sterge. Ce vrei sa faci in continuare?




Daniel Buduru
 3/5/2010 2:09:13 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
**************************************************
*-- Form:         form1 (d:\foxpro\frmautori.scx)
*-- ParentClass:  form
*-- BaseClass:    form
*-- Time Stamp:   03/04/10 06:54:01 PM
*
DEFINE CLASS form1 AS form


    DataSession = 2
    Top = 10
    Left = 8
    Height = 250
    Width = 375
    DoCreate = .T.
    Caption = "Form1"
    WindowState = 0
    BackColor = RGB(191,214,251)
    ledit = .F.
    iadd = .F.
    ladd = .F.
    *-- Specifies the index number of the selected item in a ComboBox or ListBox control.
    listindex = .F.
    Name = "Form1"


    ADD OBJECT list1 AS listbox WITH ;
        BoundColumn = 2, ;
        ColumnCount = 2, ;
        ColumnWidths = "600,0", ;
        RowSourceType = 3, ;
        RowSource = "SELECT nume, idautor FROM autori ORDER BY nume INTO CURSOR crsList1", ;
        Height = 170, ;
        Left = 24, ;
        Top = 60, ;
        Width = 156, ;
        BoundTo = .T., ;
        Name = "List1"


    ADD OBJECT text1 AS textbox WITH ;
        Height = 24, ;
        Left = 192, ;
        Top = 204, ;
        Width = 168, ;
        Name = "Text1"


    ADD OBJECT command1 AS commandbutton WITH ;
        Top = 168, ;
        Left = 192, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "Search", ;
        Name = "Command1"


    ADD OBJECT label1 AS label WITH ;
        Caption = "Lista Autori", ;
        Height = 12, ;
        Left = 24, ;
        Top = 24, ;
        Width = 96, ;
        Name = "Label1"


    ADD OBJECT cmdadd AS commandbutton WITH ;
        Top = 0, ;
        Left = 300, ;
        Height = 24, ;
        Width = 73, ;
        Caption = "Adaugare", ;
        Name = "cmdAdd"


    ADD OBJECT cmdedit AS commandbutton WITH ;
        Top = 24, ;
        Left = 300, ;
        Height = 25, ;
        Width = 73, ;
        Caption = "Modificare", ;
        Name = "cmdEdit"


    ADD OBJECT cmddelete AS commandbutton WITH ;
        Top = 48, ;
        Left = 300, ;
        Height = 25, ;
        Width = 73, ;
        Caption = "Stergere", ;
        Name = "cmdDelete"


    ADD OBJECT cmdsave AS commandbutton WITH ;
        Top = 72, ;
        Left = 300, ;
        Height = 25, ;
        Width = 73, ;
        Caption = "Salvare", ;
        Name = "cmdsave"


    ADD OBJECT cmdrevert AS commandbutton WITH ;
        Top = 96, ;
        Left = 300, ;
        Height = 25, ;
        Width = 73, ;
        Caption = "Revocare", ;
        Name = "cmdrevert"


    ADD OBJECT cmdexit AS commandbutton WITH ;
        Top = 120, ;
        Left = 300, ;
        Height = 25, ;
        Width = 73, ;
        Caption = "Iesire", ;
        Name = "cmdexit"


    PROCEDURE onlistchange
        SELECT nume, idautor FROM autori Where idautor=(thisform.ListValue) INTO CURSOR crsautor
        Thisform.text1.ControlSource="crsautor.nume"
        Thisform.Text1.Refresh
    ENDPROC


    PROCEDURE oktosave
        LOCAL llRetval &&llRetval este o variabila locala in acre tinem valoarea pe care o va returna aceasta metoda
        *Mai intai verificam daca nu cumva inregistrarea este goala.
        IF EMPTY(crsAutor.Nume)
            MESSAGEBOX('Completati autorul sau revocati',16,thisform.Caption)   &&Atentionam utilizatorul
            RETURN .f.    &&Nu continuam, nu avem ce verifica
        ENDIF

        *Verificam daca autorul exista in tabela.
        *Construim comanda select
        LOCAL lcSQL, lcWhere, lcCuvant, lcText, lcSeparator, lnArea
        lnArea=SELECT()  &&Memoram zona selectata, intrucat comanda SELECT SQL selecteaza cursorul creat
        lcSeparator=[,.- ]
        lctext=crsAutor.Nume
        lcWhere=''
        FOR lni=1 TO GETWORDCOUNT(lcText,lcSeparator )
            lcCuvant=GETWORDNUM(lctext, lni, lcSeparator )
            lcWhere=lcWhere+"UPPER(["+lcCuvant+"]) $ UPPER(nume) "
           *** Aici trebuie sa punem AND, dar numai daca nu este ultimul cuvant din sir
           IF lni<GETWORDCOUNT(lcText,lcSeparator )
              lcWhere=lcWhere+" AND "
          ENDIF
        ENDFOR
        lcWhere=IIF(EMPTY(lcWhere),'', ' WHERE ')+lcWhere
        lcSQL="SELECT * FROM autori "+lcWhere+" INTO CURSOR crsFind"

        &lcSQL

        IF RECC('crsFind')=0
           llRetval=.T.  &&Daca nu s-au gasit inregistrari, numele e unic si se poate trece la salvare
        ELSE
           *Daca s-au gasit inregistrari si suntem in adaugare numele e duplicat
           *Daca suntem in modificare, iar idautor gasit e diferit de idautor modificat, inregistrrea e duplicata
            IF Thisform.lAdd OR crsAutor.IDAutor<>crsFind.IDAutor
                MESSAGEBOX("Inregistrare duplicata",16,thisform.Caption)
               llRetval=.F.
            ELSE
               llRetval=.T.
           ENDIF
        ENDIF

        SELECT(lnArea)  &&Restabilim zona care era selectata la intrarea in metoda

        Return llRetval
    ENDPROC


    PROCEDURE onedit
        LPARAMETERS tlAdd      &&tlAdd =.T. spune ca s-a cerut o adaugare

        *Generam cursorul pe care vom face modificarea sau adaugarea
        SELECT * FROM autori WHERE idautor=(thisform.ListValue) INTO CURSOR crsAutor READWRITE
        *Clauza READWRITE permitea crearea unui cursor actualizabil. Altfel, cursorul obtinut cu select sql este readonly

        *Daca tabela autori nu are nici o inregistrare, sau filtrul nu returneaza nici o inregistrare (asta n-ar trebui sa se intample), cursorul creat nu are inregistrari si trebuie sa-i adaugam una
        IF RECC('crsAutor')=0
           APPEND BLANK IN crsAutor
        ENDIF

        *Daca s-a cerut adaugare, ne trebuie o inregistrare goala.
        IF NOT EMPTY(tlAdd)
            BLANK IN crsAutor
            Thisform.lAdd=.T.  &&Semnalam ca facem o adaugare, nu o modificare. Vom avea nevoie de aceasta informatie la salvare.
        ENDIF

        *Semnalam ca se trece in starea de editare. Obiectele vor trece in starea enabled sau disabled in functie de codul din refresh.
        Thisform.lEdit=.T.
        Thisform.refresh
    ENDPROC


    PROCEDURE ondelete
        *O inregistrare poate fi eliminata din tabela autori numai daca nu exista carti de acest autor in tabela carti.
        *Verificam existenta idautor in carti
        LOCAL lnArea, lnIDAutor, lnIndex
        lnIDAutor=CAST(Thisform.ListValue as int)
        lnArea=SELECT()
        SELECT * FROM carte wHERE idautor=lnIDautor INTO CURSOR crsFind
        SELECT (lnArea)
        IF RECC('crsFind')>0
            MESSAGEBOX('Inregistrarea nu poate fi eliminata',16,thisform.caption+' Stergere')
            Return .F.
        ENDIF
        DELETE FROM autori WHERE idautor=lnIDautor
        lnIndex=Thisform.list1.listIndex  &&Memoram linia din lista pentru a reveni in aceeasi pozitie
        Thisform.list1.Requery()
        Thisform.List1.ListIndex=MAX(Thisform.list1.ListIndex,lnIndex)
        Thisform.refresh
    ENDPROC


    PROCEDURE onsave
        IF NOT Thisform.OkToSave()
             Return .F.
        ENDIF
        *Acm, daca suntem in adaugare, vom face o inserare in tabela autori
        LOCAL lnIDAutor
        IF thisform.lAdd
            INSERT INTO autori (nume) VALUES (PROPER(crsAutor.Nume))   &&Functia Proper pune majuscula la inceputul cuvantului, iar in rest litere mici
            *Trebuie sa preluam noul idautor, ca sa pozitionam lista pe noua inregistrare
            lnIDAutor=GETAUTOINC(Thisform.DatasessionID)  
        ELSE
           lnIDAutor=crsAutor.IDAutor
           UPDATE Autori SET nume=PROPER(crsAutor.nume) WHERE IDAutor=lnIDAutor
        ENDIF

        Thisform.lAdd=.F.
        Thisform.lEdit=.F.   &&Am incheiat cu adaugarea/modificarea
        Thisform.List1.Requery()   &&Lista isi reciteste sursa
        Thisform.List1.Value=lnIDAutor
        Thisform.Refresh
    ENDPROC


    PROCEDURE onrevert
        Thisform.lEdit=.F.
        Thisform.lAdd=.F.
        Thisform.OnListChange
    ENDPROC


    PROCEDURE Load
        SET DELETED ON
        SET MULTI ON
        SET ANSI ON
        SET EXACT OFF
        SET DATE DMY
        SET CENTURY ON
        SET HOURS TO 24
        SET TALK OFF
        SET NOTIFY OFF
    ENDPROC


    PROCEDURE Init
        Thisform.AddProperty("ListValue",0)
        Thisform.list1.ControlSource="thisform.ListValue"
        Thisform.List1.listIndex=1
    ENDPROC


    PROCEDURE list1.InteractiveChange
        STORE (this.Value) TO (This.ControlSource)
        thisform.OnListChange
    ENDPROC


    PROCEDURE list1.Refresh
        THIS.Enabled=NOT thisform.lEdit
    ENDPROC


    PROCEDURE text1.Refresh
        This.Enabled=Thisform.lEdit
    ENDPROC


    PROCEDURE command1.Message
        thisform.text1=UPPER(thisform.text1)
        SELECT nume,idautor FROM autori WHERE UPPER(thisform.text1)= 'ion barbu'
    ENDPROC


    PROCEDURE cmdadd.Refresh
        THIS.Enabled= Not Thisform.lEdit
    ENDPROC


    PROCEDURE cmdadd.Click
        Thisform.OnEdit(.t.)
    ENDPROC


    PROCEDURE cmdedit.Refresh
        This.Enabled= Not Thisform.lEdit
    ENDPROC


    PROCEDURE cmdedit.Click
        Thisform.OnEdit
    ENDPROC


    PROCEDURE cmddelete.Click
        Thisform.OnDelete
    ENDPROC


    PROCEDURE cmddelete.Refresh

        This.Enabled= Not Thisform.lEdit
    ENDPROC


    PROCEDURE cmdsave.Click
        Thisform.OnSave
    ENDPROC


    PROCEDURE cmdsave.Refresh
        This.Enabled= Thisform.lEdit
    ENDPROC


    PROCEDURE cmdrevert.Click
        Thisform.OnRevert
    ENDPROC


    PROCEDURE cmdrevert.Refresh
        This.Enabled= Thisform.lEdit
    ENDPROC


    PROCEDURE cmdexit.Click
        Thisform.release
    ENDPROC


    PROCEDURE cmdexit.Refresh
        This.Enabled= Not Thisform.lEdit
    ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************

 3/5/2010 2:12:21 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Acum va trebui sa adaptez acest form  : adauga | modifica | salveaza | sterge  pentru tabela abonament
 3/5/2010 3:18:15 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/5/2010 3:18:42 PM)
Scoate acel buton Command1, nu are legatura cu ce este acum pe form.
Da, trebuie facuta o copie a acestui form - il deschizi, apoi Save As si ii schimbi numele - si faci modificarile necesare pe acea copie.
Acum ar fi momentul sa vezi cum se poate face o clasa din acest form si cum se poate lucra cu ea.
Fa insa mai intai cel puti inca un form prin copiere si modificare.
La formul pentru carti vom folosi un combobox pentru selectia autorului.



Daniel Buduru
 3/5/2010 4:00:30 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Am scos acel buton , era un buton adaugat de mine de la inceput pentru a ma obisnui si daca nu m-a incurcat nu am avut treaba cu el , oricum trebuia scos .
Am facut o copie cu numele : frmabonament
 3/5/2010 4:41:33 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Acum fa modificarile necesare.
Daca ai neclaritati, intreaba.

Daniel Buduru
 3/5/2010 7:22:22 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
am reusit sa fac modificarile necesare pentru a functiona corect . Am doar neclaritati la  stergere ...oricare as sterge nu merge , imi da acel mesaj ca : Inregistrarea nu poate fi eliminata .
Stiu ca anterior s-a faut verificare daca exista carti cu numele autorului ... si daca nu existau imi dadea voie sa sterg . Aici ma gandesc ca ar trebui sa fac verificare daca este vreo carte inregistrara in momentul de fata ?
 3/5/2010 7:33:16 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Trebuie sa verifici daca acea carte a fost imprumutata vreodata. Daca a fost, nu trebuie sa se poata sterge.
La fel si pentru abonat.
In mod normal, aceasta verificare se face la nivelul bazei de date, prin intermediul relatiile de integrtate referentiala.
Am renuntat la construirea acestor relatii din cauza intarzierii.
Daca recuperezi ceva timp, le vom pune.

Daniel Buduru
 3/5/2010 8:00:33 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Am terminat cu cele 2-a .... acum ar urma adaugarea | modificarea | salvarea | stergerea unui carti ... lucrurile se complica .... numai pot selecta sau modifica decat un nume , va trebui sa pot modifica toate detaliile : autor | titlu | volum | etc
 3/5/2010 8:02:33 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
De ce nu poti selecta sau modifica decat un nume? Unde ar fi aceasta limitare?

Daniel Buduru
 3/5/2010 8:21:59 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
pey am de exemplu adaugarea unei carti ....aici va trebui sa introduc :

autorul - titlul - volum - tstoc - dstoc - pret - sector -rand -raft - corp .... deci am mai multe campuri de completat
 3/5/2010 8:54:18 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/5/2010 8:54:33 PM)
Desigur, dar tot nu vad ce te impiedica sa le pui pe toate.
Scrie un select cu care sa populezi lista. Vei avea nevoie de un join intre tabela carti si tabela autori, ca sa aduci numele autorului.
Pentru partea de afisare campuri, pune un combobox la autor, restul sunt textbox-uri.
Combo autor se populeaza la fel ca lista din formul autori - exact aceleasi proprietati. In controlSource va avea idautor.
Si scrie acum comanda select prin care verifici existenta volumui si cele prin care faci inserarea si modificarea.


Daniel Buduru
 3/6/2010 12:57:09 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
lista zic eu ca am reusit sa o actualizez :

RowSource = SELECT nume,car.idautor FROM carte car INNER JOIN autori aut ON car.idautor = aut.idautor  ORDER BY nume INTO CURSOR crsList1

combo-boxul nu reusesc deloc sa il actualizez sa arate la fel ca text-boxul .proprietatile la fel
Am incercat in control source si  : idautor si carte.idautor si autor.idautor .
 3/6/2010 1:25:29 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/6/2010 1:32:52 PM)
Vad ca doar copiezi codul pe care l-am pus eu, si inca nu l-ai inteles.
Ziceam sa faci mai intai selecturile - si implicit s ale postezi - ca sa luam problemele pe rand, in ordinea in care ar trebui definite.

In combobox autor afisezi date doar din autori. Si am zis sa copiezi proprietatile din formul autori list1.
In combobox.controlsource pui campul idautor din cursorul creat pentru actualizare - dar nu stiu cum l-ai botezat si nici cum l-ai definit.
Combobox.Style = 2 - Dropdown List, pentru ca vrem doar sa afisam autorul, nu sa-l si editam.

Cursorul creat cu :
SELECT nume,car.idautor FROM carte car INNER JOIN autori aut ON car.idautor = aut.idautor  ORDER BY nume INTO CURSOR crsList1
 ar fi oarecum potrivit pentru popularea
listei din stanga, dar nu e chiar in forma care ne trebuie.

SELECT CAST(TRIM(tiltu)+' - '+nume as char(100)) as carte, idcarte FROM carti LEFT JOIN autori ON carte.idautor=autori.idautor  ORDER  1 INTO CURSOR crsList1

Vrem sa afisam in lista titlul si autorul :

Poezii Vol 1 - George Toparceanu.


Daca am pune titlu+' - '+nume s-ar afisa ceva de forma asta:

Poezii Vol 1                                    - George Toparceanu


Functia TRIM elimina spatiil de la dreapta.
Functia CAST face o conversie de tip si dimensiune. In cazul nostru, tipul e acelasi - caracter - si pentru argument, si pentru rezultat. Folosim functia doar pentru a indica lungimea campului. Comanda SELECT ia ca lungime a camului prima valoare regasita inampul respectiv. Daca in liniile urmatoare exista un camp cu o lungime mai mare, este trunchiat (in vfp9 s-a corectat partial acest comportament, dar este prezent in verisunile anterioare).
Lista trebuie sa returneze IDCarte, pe care il folosim mai departe la selectia inregistrarii resUpdatepective din tabela carti.


Daniel Buduru
 3/6/2010 7:45:51 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
lista am reusit sa o actualizez .... acum imi arata titlul si numele autorului ....
acel combo tot nu vrea sa faca , ar trebui sa am ceva de genul :

form1.onlistchange :
SELECT CAST(TRIM(titlu)+' - '+nume as char(100)) as carte, idcarte FROM carte LEFT JOIN autori ON carte.idautor=autori.idautor  where idcarte=(thisform.listValue)  INTO CURSOR crsautor
Thisform.combo1.ControlSource="crsautor.nume"
Thisform.combo1.Refresh

adica , va trebui sa imi afiseze titlul si autorul , JOIN-ul este facut si trebuie ca idcartii sa fie = cu ce este generat de lista si totul este stocat in cursorul crsautor.
 3/6/2010 9:49:13 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/7/2010 11:22:15 AM)
In Form1.onlistchange trebuie sa selectezi o inregistrare completa din carti, pe care sa o fisezi in textboxuri si comboboxuri.

SELECT * from carti WHERE idcarte=(thisform.listValue)  INTO CURSOR crsCarte
Thisform.Text1.ControlSource="crsCarte.Titlu"
Thisform.Combo1.ControlSource="crsCarte.IDAutor"
Thisform.Text2.ControlSourve="crsCarte.Exemplare"
* Si asa mai departe, cate un textbox pentru fiecare camp din crsCarte
Thisform.Refresh  &&Sunt cam multe controale pentru a face un refresh individual. O varianta ar fi sa le punem intr-un container.

Pui controalele unele sub altele, aliniate vertical - label si textbox sau combobox.


Daniel Buduru
 3/7/2010 10:37:35 AM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Am pus toate textbox-urile si combo-ul . In onlistchange am asa :

SELECT * from carte WHERE idcarte=(thisform.listValue)  INTO CURSOR crsCarte
Thisform.Combo1.ControlSource=crsCarte.IDAutor
Thisform.Text2.controlsource=crsCarte.titlu
Thisform.Text3.ControlSource=crsCarte.volum
Thisform.Text4.ControlSource=crsCarte.pret
Thisform.Text5.ControlSource=crsCarte.volum
Thisform.Text6.ControlSource=crsCarte.tstoc
Thisform.Text7.ControlSource=crsCarte.dstoc
Thisform.Text8.ControlSource=crsCarte.sector
Thisform.Text9.ControlSource=crsCarte.rand
Thisform.Text10.ControlSource=crsCarte.corp
Thisform.Text11.ControlSource=crsCarte.raft
Thisform.Refresh

iar cand rulez imi zice : the data source for this object must be a variable reference  ( form1.onlistchange -> Thisform.Text2.controlsource=crsCarte.titlu )
 3/7/2010 11:27:31 AM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Eu n-am scris corect
Numele campului di controlsource trebuie pus intre delimitatori de caracter ' " []

SELECT * from carte WHERE idcarte=(thisform.listValue)  INTO CURSOR crsCarte
Thisform.Combo1.ControlSource="crsCarte.IDAutor"
Thisform.Text2.controlsource="crsCarte.titlu"
Thisform.Text3.ControlSource="crsCarte.volum"
Thisform.Text4.ControlSource="crsCarte.pret"
Thisform.Text5.ControlSource="crsCarte.volum"
Thisform.Text6.ControlSource="crsCarte.tstoc"
Thisform.Text7.ControlSource="crsCarte.dstoc"
Thisform.Text8.ControlSource="crsCarte.sector"
Thisform.Text9.ControlSource="crsCarte.rand"
Thisform.Text10.ControlSource="crsCarte.corp"
Thisform.Text11.ControlSource="crsCarte.raft"
Thisform.Refresh

Ai de doua ori campul volum, la Text3 si la Text5.
In refresh pui la toate controalele legate la acest cursor
This.Enabled=Thisform.lAdd


Daniel Buduru
 3/7/2010 12:08:01 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Imi afiseaza corect acum inafara de combo ...el tot nu vrea .
La refresh nu trebuia sa fie : This.Enabled=Thisform.lEdit

am o mica problema , aleg un titlu-autor ii dau modificare , modific ceva , ii dau salveaza , imi salveaza ...dar daca mut pe alt autor si revin iar pe cel modificat anterior nu imi retine modificarea facuta .
 3/7/2010 12:20:59 PM
User is offlinejustgioni
57 posts


Re: Atestat 201a
 (N/A)
Incearca cu comanda FLUSH dupa ce ai facut salvarile.
 3/7/2010 12:26:31 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Imi afiseaza corect acum inafara de combo ...el tot nu vrea .
La refresh nu trebuia sa fie : This.Enabled=Thisform.lEdit

am o mica problema , aleg un titlu-autor ii dau modificare , modific ceva , ii dau salveaza , imi salveaza ...dar daca mut pe alt autor si revin iar pe cel modificat anterior nu imi retine modificarea facuta .
 3/7/2010 12:26:45 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Ai dreptate, lEdit.

Cum arata comanda UPDATE?


Daniel Buduru
 3/7/2010 12:30:52 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
la asta te referi :
IF NOT Thisform.OkToSave()
     Return .F.
ENDIF
*Acm, daca suntem in adaugare, vom face o inserare in tabela autori
LOCAL lnIDcarte
IF thisform.lAdd
    INSERT INTO carte (titlu) VALUES (PROPER(crscarte.titlu))   &&Functia Proper pune majuscula la inceputul cuvantului, iar in rest litere mici
    *Trebuie sa preluam noul idautor, ca sa pozitionam lista pe noua inregistrare
    lnIDcarte=GETAUTOINC(Thisform.DatasessionID) 
ELSE
   lnIDcarte=crscarte.IDcarte
   UPDATE carte SET titlu=PROPER(crscarte.titlu) WHERE IDcarte=lnIDcarte
ENDIF

Thisform.lAdd=.F.
Thisform.lEdit=.F.   &&Am incheiat cu adaugarea/modificarea
Thisform.List1.Requery()   &&Lista isi reciteste sursa
Thisform.List1.Value=lnIDcarte
Thisform.Refresh

ma gandesc ca la update acolo in celalalt form era idautor.nume ....aici am modificat si eu cum am crezut ca ar fii , dar acum imi dau seama ca aici sunt mai multe campuri si ar trebui o alta structura .
 3/7/2010 12:32:36 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
La combo1:
RowSource:           SELECT nume, IDAutor FROM autori ORDER BY 1 INTO CURSOR crsCombo1
RowSourceType:   3 - SQL Statement
ColumnCount:        2
ColumnWidths:      300,0
BoundColumn:       2
BoundTo:               .T.

Verifica aceste proprietati.
Cand intri in editare, deschide combo si vezi daca este populat.



Daniel Buduru
 3/7/2010 12:42:40 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
da , acum este populat cu toti autorii .
 3/7/2010 12:43:19 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/7/2010 12:44:13 PM)
 GooDy wrote
la asta te referi :
IF NOT Thisform.OkToSave()
     Return .F.
ENDIF
*Acm, daca suntem in adaugare, vom face o inserare in tabela autori
LOCAL lnIDcarte
IF thisform.lAdd
    INSERT INTO carte (titlu) VALUES (PROPER(crscarte.titlu))   &&Functia Proper pune majuscula la inceputul cuvantului, iar in rest litere mici
    *Trebuie sa preluam noul idautor, ca sa pozitionam lista pe noua inregistrare
    lnIDcarte=GETAUTOINC(Thisform.DatasessionID) 
ELSE
   lnIDcarte=crscarte.IDcarte
   UPDATE carte SET titlu=PROPER(crscarte.titlu) WHERE IDcarte=lnIDcarte
ENDIF

Thisform.lAdd=.F.
Thisform.lEdit=.F.   &&Am incheiat cu adaugarea/modificarea
Thisform.List1.Requery()   &&Lista isi reciteste sursa
Thisform.List1.Value=lnIDcarte
Thisform.Refresh

ma gandesc ca la update acolo in celalalt form era idautor.nume ....aici am modificat si eu cum am crezut ca ar fii , dar acum imi dau seama ca aici sunt mai multe campuri si ar trebui o alta structura .


Intr-adevar, ai mai multe campuri, si trebuie actualizate toate.

IF thisform.lAdd
    INSERT INTO carte (titlu, idautor, volum, pret, dstoc, tstoc, sector, rand, raft ) ;
       VALUES  (PROPER(crscarte.titlu), crsCarte.idautor, crsCarte.Volum, crsCarte.Pret, crsCarte.dStoc, crsCarte.sector, crscarte.rand, crscarte.raft)
    lnIDcarte=GETAUTOINC(Thisform.DatasessionID) 
ELSE
   lnIDcarte=crscarte.IDcarte
   UPDATE carte SET titlu=PROPER(crscarte.titlu), idautor=crscarte.idautor, pret=crscarte.pret, dstoc=crscarte.dstoc, ;
         tstoc=crscarte.tstoc, sector=crscarte.sector, rand=crscarte.rand, raft=crscarte.raft ;
         WHERE IDcarte=lnIDcarte
ENDIF



Daniel Buduru
 3/7/2010 1:04:05 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
corect ....ma gadeam la ceva de genul dar oricum nu ma gandeam exact la cum era :D .
Imi modifica corect , acum am problema la adaugare ... introduc datele si cand dau save nu se intampla nimic .
Banuiesc ca este din :

LOCAL llRetval &&llRetval este o variabila locala in acre tinem valoarea pe care o va returna aceasta metoda
*Mai intai verificam daca nu cumva inregistrarea este goala.
IF EMPTY(crscarte.titlu)
    MESSAGEBOX('Completati autorul sau revocati',16,thisform.Caption)   &&Atentionam utilizatorul
    RETURN .f.    &&Nu continuam, nu avem ce verifica
ENDIF

*Verificam daca autorul exista in tabela.
*Construim comanda select
LOCAL lcSQL, lcWhere, lcCuvant, lcText, lcSeparator, lnArea
lnArea=SELECT()  &&Memoram zona selectata, intrucat comanda SELECT SQL selecteaza cursorul creat
lcSeparator=[,.- ]
lctext=crscarte.titlu
lcWhere=''
FOR lni=1 TO GETWORDCOUNT(lcText,lcSeparator )
    lcCuvant=GETWORDNUM(lctext, lni, lcSeparator )
    lcWhere=lcWhere+"UPPER(["+lcCuvant+"]) $ UPPER(titlu) "
   *** Aici trebuie sa punem AND, dar numai daca nu este ultimul cuvant din sir
   IF lni<GETWORDCOUNT(lcText,lcSeparator )
      lcWhere=lcWhere+" AND "
  ENDIF
ENDFOR
lcWhere=IIF(EMPTY(lcWhere),'', ' WHERE ')+lcWhere
lcSQL="SELECT * FROM carte "+lcWhere+" INTO CURSOR crsFind"

&lcSQL

IF RECC('crsFind')=0
   llRetval=.T.  &&Daca nu s-au gasit inregistrari, numele e unic si se poate trece la salvare
ELSE
   *Daca s-au gasit inregistrari si suntem in adaugare numele e duplicat
   *Daca suntem in modificare, iar idautor gasit e diferit de idautor modificat, inregistrrea e duplicata
    IF Thisform.lAdd OR crscarte.IDcarte<>crsFind.IDcarte
        MESSAGEBOX("Inregistrare duplicata",16,thisform.Caption)
       llRetval=.F.
    ELSE
       llRetval=.T.
   ENDIF
ENDIF

SELECT(lnArea)  &&Restabilim zona care era selectata la intrarea in metoda

Return llRetval


am incercat ca la : IF EMPTY(crscarte.titlu) sa introduc cum s-a rezolvat anterior dar mi-a dat eroare .
 3/7/2010 1:58:03 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
LOCAL llRetval &&llRetval este o variabila locala in care tinem valoarea pe care o va returna aceasta metoda
*Mai intai verificam daca nu cumva inregistrarea este goala.
IF EMPTY(crscarte.titlu)
    MESSAGEBOX('Completati titlul sau revocati',16,thisform.Caption)   &&Atentionam utilizatorul
    RETURN .f.    &&Nu continuam, nu avem ce verifica
ENDIF

*Verificam daca titlul exista in tabela.
*Construim comanda select
LOCAL lcSQL, lcWhere, lcCuvant, lcText, lcSeparator, lnArea
lnArea=SELECT()  &&Memoram zona selectata, intrucat comanda SELECT SQL selecteaza cursorul creat
lcSeparator=[,.- ]
lctext=crscarte.titlu
lcWhere=''
FOR lni=1 TO GETWORDCOUNT(lcText,lcSeparator )
    lcCuvant=GETWORDNUM(lctext, lni, lcSeparator )
    lcWhere=lcWhere+"UPPER(["+lcCuvant+"]) $ UPPER(titlu) "
   *** Aici trebuie sa punem AND, dar numai daca nu este ultimul cuvant din sir
   IF lni<GETWORDCOUNT(lcText,lcSeparator )
      lcWhere=lcWhere+" AND "
  ENDIF
ENDFOR
lcWhere=IIF(EMPTY(lcWhere),'', ' WHERE ')+lcWhere
lcSQL="SELECT * FROM carte "+lcWhere+" INTO CURSOR crsFind"

&lcSQL

IF RECC('crsFind')=0
   llRetval=.T.  &&Daca nu s-au gasit inregistrari, titlul e unic si se poate trece la salvare
ELSE
   *Daca s-au gasit inregistrari si suntem in adaugare numele e duplicat
   *Daca suntem in modificare, iar idcarte gasit e diferit de idcarte modificat, inregistrrea e duplicata
    IF Thisform.lAdd OR crscarte.IDcarte<>crsFind.IDcarte
        MESSAGEBOX("Inregistrare duplicata",16,thisform.Caption)
       llRetval=.F.
    ELSE
       llRetval=.T.
   ENDIF
ENDIF

IF llRetval
   IF empty(crsCarte.tstoc)
       MESSAGEBOX("Completati numarul de exemplare !",16,thisform.Caption
       llRetval=.f.
   ENDIF
ENDIF

SELECT(lnArea)  &&Restabilim zona care era selectata la intrarea in metoda

Return llRetval

Daniel Buduru
 3/7/2010 2:43:24 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
cu mici ajustarii totul functioneaza perfect
 3/7/2010 2:56:06 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
 GooDy wrote
cu mici ajustarii totul functioneaza perfect


Si la mine programul s-a schimbat complet in ultimul timp - ca sa nu zic dat complet peste cap. N-am mai avut timp nici sa citesc cu atentie ce ai scris in unele posturi, nici sa ma mai uit odata peste ce am scris, necum sa mai explic pas cu pas ce facem.
Sper ca in cateva zile sa revin la normal, si sa comentam codul facut pana acum.

Pe acelasi principiu trebuie sa faci si formul pentru imprumut.
Aici insa vei avea mai intai un combobox cu abonatii, din care se selecteaza abonatul care imprumuta sau restituie o carte.
Cu idabonat obtinut de la acest combo, populam lista cu titlurile, data imprumut, termen returnare, data returnare si idimprumut. Eventual punem in filtru si conditia sa nu apara decat cartile nereturnate inca.
Vom avea vizibile primele 4 coloane, ne legam la ultima coloana - idimprumut.
Ghidandu-te dupa ce am facut pana acum, spune unde si ce cod vom scrie pentru a actualiza lista in functie de abonatul selectat in combobox.
Cu idimprumut selectam imprumutul si populam cursorul crsimprumut.
Vom afisa titlul intr-un combobox si datele in textboxuri.
La OkToSave nu vom mai avea aceleasi conditii. Spune tu ce anume ar trebui sa verificam inainte de a salva o inregistrare de imprumut.

Ar fi bine sa postezi codul si unde il pui, ca sa avem pe ce discuta.


Daniel Buduru
 3/7/2010 3:50:09 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
deci...o sa vina cam asa :

lista va fii populata cu Numele din abonament :
RowSource = SELECT nume,idabonat from abonament   ORDER  by nume  INTO CURSOR crsList1

combo1 va fi populat cu acest nume al abonatului ( implicit lista tuturor abonatilor )
combo2 va fi popuat cu lista cartilor
+ inca 3 text-box-uri pentru dimprumut | dreturnare | dtermen

e ok pana acum ?
 3/7/2010 6:13:00 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/7/2010 7:54:21 PM)
Partial.
Deasupra listei pui un combo populat cu abonatii. O sa-l numim cboAbonat
Rowsource: SELECT nume, idabonat FROM abonament ORDER BY 1 INTO CURSOR crsCboAbonat.
RowSourceType: 3
ColumnCount: 2
ColumnWidths: 200,0
BoundColumn: 2
BoundTo: .T.
Style: 2 - Dropdown List

Din acest combo alegi abonatul, iar cboAbonat.Value va contine IDAbonat
Cu acest IDAbonat populam list1:
List.RowSource="SELECT titlu, dimprumut, dtermen, idimprumut FROM imprumut INNER JOIN carti ON imprumut.idcarte=carti.idcarte WHERE imprumut.idabonat=(Thisform.cboAbonat.Value) AND EMPTY(dreturnare)"
List1 va avea 4 coloane, si vom obtine valoare din coloana a 4-a
ColumnCount: 4
ColumnWidths: 250,100,100,0
BoundColumn: 4
BoundTo: .T.
Vei redimensiona coloanele astfel incat sa se vada complet datele, dar poti trunchea titlul cartii, atat cat sa nu fie ambiguu. Desigur, vei redimensiona si lista, ca sa fie vizibile cele 3 coloane

Acum in list1 vom avea cartile imprumutate de abonatul selectat in cboAbonat.
In dreapta listei ai nevoie de un combo (combo2 - populat cu lista cartillor), cum ai zis, si de acele 3 textbox-uri, pe care le populezi din metoda OnListChange a formului.
Nu ai nevoie de un alt combo pentru IDAbonat - vei folosi idabonat selectat in cboAbonat.


Daniel Buduru
 3/7/2010 7:32:12 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
am construit acel combo deasupra listei , afiseaza corect . Am o problema la lista , cand introduc codul pentru rowsource imi spune : operator/operand type mismatch ....( form1.init ) . stiu ca am mai avut aceasta eroare , am incercat sa pun "" , sa il scot din paranteze acel imprumut.idabonat=(Thisform.List1.Value) ... sa fie oare problema ca acum lista are 4 coloane ?
 3/7/2010 7:53:02 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/7/2010 7:56:58 PM)
"Operator/Operand type mismatch" spune ca variabila (sau proprietate) e de alt tip decat cel asteptat.
Vine intr-adevar de la proprietatea Value a unei liste sau combobox.
Am sa explic ce se intampla.
Toate coloanele din lista (saun din combo) au tipul implicit caracter.
Daca este precizata o variabila, un camp sau o proprietate in ControlSource, lista assigneaza automat proprieiatii value tipul campului sau variabilei din controlsource.
Astfel, daca adaugam formului o proprietate idabonat, si ii dam valoarea 0, apoi asignam aceasta proprietate in controlsource, combo.value va fi de tip numeric.
Daca nu facem asta, combo.value va fi de tip caracter.

Acum sa identificam unde anume apare aceasta situatie.
Cand primesti un mesaj de eroare la o aplicatie rulata din VFP IDE, ai posibilitatea sa suspenzi executia (butonul Suspend), apoi sa pornesti debugger-ul (din meniu-ul tools) si sa vezi exact linia de cod care a generat eroarea. E mult mai simplu de depanat asa.
In lipsa acestei informatii, sa vedem unde anume in cod s-ar putea intampla asta.
Prima sursa ar fi cboAbonat, careia nu i-am assignat nimic in controlsource.
Prin urmare, comanda SELECT din list1.RowSource, care foloseste valoarea din cboAbonat in clauza where, va avea o valoare de tip caracter in loc de una de tip numeric.
Fie punem o variabila sau proprietate de tip numeric in cboAbonat.ControlSource, fie facem conversia de tip in comanda select

thisform.List1.RowSource="SELECT titlu, dimprumut, dtermen, idimprumut FROM imprumut INNER JOIN carti ON imprumut.idcarte=carti.idcarte ;
WHERE imprumut.idabonat=CAST(Thisform.cboAbonat.Value as int) AND EMPTY(dreturnare)"

Aici mai era o eroare, am scris imprumut.idabonat=(thisform.List1.Value), ceea ce nu e corect, trebuie valoarea din cboAbonat, nu din list1. Am corectat si postul anterior.

Cum faci ca lista sa-si reciteasca sursa atunci cand selectezi un abonat in cboAbonat? Ce cod pui si unde?


Daniel Buduru
 3/7/2010 8:33:03 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
in postul precedent am postat doar form unde imi da eroarea nu si linia , eroarea o arata aici : form1.lnit -> Thisform.List1.ControlSource="thisform.ListValue"

am inlocuit cu codul scris de tine si cand dau run la form imi deschide direct o tabela Query cu titlu   |dimprumut |dtermen |idimprumut
 3/7/2010 8:37:17 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Pune in coada comenzii select INTO CURSOR crsList1


Daniel Buduru
 3/8/2010 7:03:37 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Am adaugat , nu imi mai da nici o eroare dar nici nu imi afiseaza nimic , normal nu ar trebui sa imi afiseze :  titlu, dimprumut, dtermen, idimprumut  ?

Cand selectam un abonat din cboAbonat ar trebui in list1 sa imi afiseze titlul cartei imprumutate , dimprumut , dtermen ...corect ? , daca ar fii asa ce rol mai au text1, text2 , text3 si combo1 ?
 3/8/2010 7:13:00 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/8/2010 7:13:26 PM)
 Daniel Buduru wrote
....
....
Cum faci ca lista sa-si reciteasca sursa atunci cand selectezi un abonat in cboAbonat? Ce cod pui si unde?


Cred ca asta ti-a scapat din postul respectiv.
Normal ca nu iti afiseaza nimic, daca nu ai pus codul necesar.
Ce cod ar trebui sa pui si unde anume, pentru ca lista sa arata imprumuturile abonatului selectat in combo?
Un indiciu: am mai facut asa ceva in primul form (apoi ai copiat in toate ...).

Daniel Buduru
 3/8/2010 7:37:12 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Pey in primul form avem asa :
lnit : Thisform.AddProperty("ListValue",0)
Thisform.list1.ControlSource="thisform.ListValue"
Thisform.List1.listIndex=1

ce face asta : adauga proprietatea ListValue ,  dupa aceea adauga un controlsource list1 ...

OnListChange :
SELECT nume, idautor FROM autori Where idautor=(thisform.ListValue) INTO CURSOR crsautor
Thisform.text1.ControlSource="crsautor.nume"
Thisform.Text1.Refresh

eu m-a gandeam asa : intai sa modific in lnit  :

Thisform.AddProperty("ListValue",0)
Thisform.cboAbonat.ControlSource="thisform.ListValue"
Thisform.cboAbonat.listIndex=1

nu stiu de ce dar cred ca am scris o prostie
 
 3/8/2010 8:28:43 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Doar partial. Prostia, daca vrei sa-i zici asa, e sa modifici codul scris pentru lista .... inca folosim lista, deci avem nevoie de acel cod.

Daca vrei sa faci programare candva, va trebui sa te obienuiesti cu un lucru: sa nu gandesi in comenzile unui limbaj, ci sa te gandesti la ce vrei sa faci si cum sa faci. Abia apoi le transpui in limbajul de programare ales. Algoritmul e acelasi indiferent daca lucrezi in VFP sau in C++.

Deci, ce anume vrem?
Vrem ca atunci cand utilizatorul a selectat un abonat in combobox, lista sa se populeze cu imprumuturile inca nereturnate ale acelui abonat.
Apoi in lista sa se selecteze prima inregistrare, iar in controalele din form sa se afiseze acea inregistrare.

Cum facem asta?
Mai intai, pentru ca am stabilit de la inceput ca aplicatia va fi "event driven", trebuie sa gasim un eveniment al combobox care sa se declanseze atunci cand utilizatorul a selectat abonatul. Cand l-a selectat, nu cand s-a plimbat prin lista abonatilor.
Apoi trebuie sa retinem id-ul acelui abonat si sa repolulam lista.
Dupa repolularea listei, sa ne plasam pe prima inregistrare, sa-i luam id-ul si sa afisam in form datele corespunzatoare acelui id.

Tema:
Ce eveniment al combobox-ului se declanseaza cand s-a selectat o pozitie din lista derulanta?
Unde gasim, im combobox, id-ul acelei pozitii? In ce proprietate?
Ce metoda a listei o repopuleaza?
Cum pozitionam lista pe prima inregistrare?
Daca abonatul are mai multe carti imprumutate, pe care din ele ar trebui sa ne pozitionam?




Daniel Buduru
 3/8/2010 9:00:04 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Dupa cum ai explicat in posturile din urma pentru deplasarea prin lista aveam evenimentul : interactivChange .... aici nu ne trebuie acesta deoarece trebuie actualizat atunci cand selectam si cred eu ca ceea ce ne trebuie noua este evenimentul Click.
Pey in RowSource selectam numele si idAbonat care il stocheaza in crsCboAbonat
DUpa cum ai spus in Methods , cele cu fulgeru galben sunt evenimentele iar restu sunt metodele , deci ar trebui ca metoda Refresh sa o repopuleze .
Cum am pozitionat-o si inainte : Thisform.List1.listIndex=1
Pe prima carte .
 3/8/2010 9:06:52 PM
User is offlineGrigore Dolghin
3522 posts
www.class-software.eu
1st






Re: Atestat 201a
 (N/A)
Listele si combo-urile au o metoda speciala pentru reinterogarea sursei de date - se numeste Requery. Nu stiu este potrivita pentru tine in ceea ce faci acum, dar e bine sa stii de ea. Un exemplu de folosire ar fi cand afisezi inregistrarile dintr-o tabela intr-un listbox pe un form iar pe acelasi form ai si textbox-uri pentru adaugarea unei inregistrari noi in aceeasi tabela. Dupa ce dai Save, trebuie sa dai ListBox.Requery() ca sa interogheze din nou tabela respectiva.
Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 3/8/2010 9:23:11 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Grig, asa si este in metoda OnSave din form, dar lui Marius i-a scapat ca se face repopularea listei dupa adaugare sau modificare - desi am pus acolo un comentariu cu ce face comanda respectiva ...



Daniel Buduru
 3/8/2010 9:26:19 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
 GooDy wrote
Dupa cum ai explicat in posturile din urma pentru deplasarea prin lista aveam evenimentul : interactivChange .... aici nu ne trebuie acesta deoarece trebuie actualizat atunci cand selectam si cred eu ca ceea ce ne trebuie noua este evenimentul Click.
Pey in RowSource selectam numele si idAbonat care il stocheaza in crsCboAbonat
DUpa cum ai spus in Methods , cele cu fulgeru galben sunt evenimentele iar restu sunt metodele , deci ar trebui ca metoda Refresh sa o repopuleze .
Cum am pozitionat-o si inainte : Thisform.List1.listIndex=1
Pe prima carte .


In  RowSource nu selectam nimic, rowsource spune doar cea anume se afiseaza in lista ...
De selectat, se selecteaza o pozitie din lista, iar continutul coloanei specificata prin BoundColumn este pus in proprietatea Value a obiectului.

Bun, deci ne trebuie cod in cboAbonat.Click
Ce cod?

 

Daniel Buduru
 3/8/2010 9:28:07 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
corect , m-am gandit si la aceasta , dar nefiind sigur pe mine , am batut in cap 2 informatii contradictorii ... ai spus mai sus : metoda a listei ...in metodele listei nu apar metodele introduse de noi , doar in form . Imi cer scuze , asa se intampla cand nu sunt sigur pe mine . :(
 3/8/2010 9:45:03 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Obiectele au si metode implicite.
Nu e nici o problema daca nu esti sigur. Nu suntem la scoala si nu punem note.
Intrebarile pe care ti le pun au scopul de a te face sa cauti singur raspunsuri, si nu e nici o problema daca pui alte intrebari pentru a gasi respunsul de care ai nevoie.

Deci, ce cod punem in cboAbonat.click ?



Daniel Buduru
 3/8/2010 10:05:17 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
deci trebuie sa retinem IDabonat , nu vad de ce nu s-ar potrivi codul din interactivchange

STORE (this.Value) TO (This.ControlSource)
thisform.OnListChange
 3/8/2010 10:15:53 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
N-am pus nimic in cboAbonat.ControlSource ...
Si in form.OnListChange nu se repopuleaza lista.
Mai incearca.
Trebuie sa preluam valoarea de unde ? si sa comandam repopularea listei - cu ce comanda?


Daniel Buduru
 3/9/2010 12:09:44 AM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Am stat si m-am gandit si mi-a iesit asta :

cu ce se stocheaza o valoare - cu ControlSource ... deci ...
Thisform.AddProperty("ListValue",0)
Thisform.cboABonat.ControlSource="thisform.ListValue"


cu ce se updateaza lista daca au intervenit modificari in RowSource ...

Thisform.list1.Requery()
 3/9/2010 12:22:54 AM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
De data asta e aproape bine. Aproape si nu bine pentru ca nu tii cont de faptul ca deja folosim proprietatea form.ListValue pentru a tine valoarea list1.Value. Daca o reatribuim lui cboAbonat, se dau peste cap metodele in care am folosit thisform.ListValue pentru a tine valoarea listei.

Pe de alta parte, valoarea fiecarui control este tinuta in proprietatea Value. Daca un control are proprietatea ControlSource completata, valoarea din Value se transfera in campul, variabila sau proprietatea definite in ControlSource dupa ce se incheie evenimentul valid.

Daca te uiti la comanda select din list1.RowSource, vei vedea ca in clauza Where avem valoarea din cboAbonat.Value

thisform.List1.RowSource="SELECT titlu, dimprumut, dtermen, idimprumut FROM imprumut INNER JOIN carti ON imprumut.idcarte=carti.idcarte ;
WHERE imprumut.idabonat=CAST(Thisform.cboAbonat.Value as int) AND EMPTY(dreturnare) INTO CURSOR crsList1"

Deci, tot ce avem de facut este sa punem in eventul pe care-l folosim pentru a determina ca in cboAbonat s-a selectat o valoare.

Thisform.List1.Requery()
Thisform.List1.ListIndex=1


Ai zis sa folosim cboAbonat.Click pentru asta. Pune deci codul acolo si sa vedem cum merge.



Daniel Buduru
 3/9/2010 9:38:02 AM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
am pus , dar nu se afiseaza nimic in list1
 3/9/2010 9:59:05 AM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Sa vedem din ce cauza.
Mai intai verificam daca obtinem idabonat din cboAbonat.
Ce are in RowSource? BoundColumn? BoundTo?

Apoi verificam daca selectul din list1.rowsource returneaza inregistrari.
Exista inregistrari cu dtreturnare necompletat? Ce returneaza comanda urmatoare?

SELECT DISTINCT idabonat FROM imprumut WHERE EMPTY(dtreturnare)

Daniel Buduru
 3/9/2010 10:38:54 AM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
cboAbonat.RowSource - SELECT nume, idabonat FROM abonament ORDER BY 1 INTO CURSOR crsCboAbonat
cboAbonat.boundcolumn - 2
cboAbonat.boundTo - T

nu exista inregistrari cu dreturn necompletate


 3/9/2010 10:47:48 AM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Deci list1 nu are cu ce se popula
Fie schimbam conditia din filtru, ca sa ia toate imprumuturile, fie punem dtreturnare blank la cateva inregistrari.
Deocamdata, sa scoatem conditia din filtru:

thisform.List1.RowSource="SELECT titlu, dimprumut, dtermen, idimprumut FROM imprumut INNER JOIN carti ON imprumut.idcarte=carti.idcarte ;
WHERE imprumut.idabonat=CAST(Thisform.cboAbonat.Value as int) INTO CURSOR crsList1"



Daniel Buduru
 3/9/2010 10:51:20 AM
User is offlineGrigore Dolghin
3522 posts
www.class-software.eu
1st






Re: Atestat 201a
 (N/A)
Heh... copilul asta o sa invete mai multa programare aici pe forum decat a invatat in liceu.

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 3/9/2010 11:18:45 AM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
corect , am schimbat si acum functioneaza ....cand selectez un Abonat care are o carte imprumutata imi afiseaza in lista titlul cartii imprumutate , dimprumut, dtermen ...am mai schimbat umpic latimea coloanelor si a listei pentru a-mi afisa toate datele .

problema e ca la scoala nici macar nu ne-a pomenit de aceste lucruri , daca facem la scoala aveam si eu habar si nu va mai deranjam asa mult .
 3/9/2010 11:26:33 AM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Am inteles de mult, din diverse intrebari puse pe forum, ce se face la scoala ...
Ce te face sa crezi ca deranjezi pe cineva aici pe forum?

Daniel Buduru
 3/9/2010 11:30:26 AM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Ma gandesc ca pun intrebari prea usoare si uneori stresante pentru cineva care stie despre ce este vorba , vad ca imi dai indicii si incerci sa ma inveti sa fac singur dar observ ca tot nu imi iese corect .Ma simt jenat fata de tine si fata de timpul pierdut pentru a-mi explica mie .
 3/9/2010 11:43:00 AM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
acum avem :

combo1 care va trebui populat cu titlul cartilor : RowSource :  SELECT titlu, IDcarte FROM carte ORDER BY 1 INTO CURSOR crsCombo1
avem text1,text2,text3 acestea trebuiesc completate in metoda onlistchange a form-ului ...dar : text1 - dimprumut | text2 - dtermen | iar text3 - va trebui sa fie dreturn ..corect ? ...dar nu avem dreturn in list1 deci va trebui lasat necompletat in metoda onlistchange .
 3/9/2010 11:57:23 AM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
 GooDy wrote
Ma gandesc ca pun intrebari prea usoare si uneori stresante pentru cineva care stie despre ce este vorba , vad ca imi dai indicii si incerci sa ma inveti sa fac singur dar observ ca tot nu imi iese corect .Ma simt jenat fata de tine si fata de timpul pierdut pentru a-mi explica mie .

Intrebarile nu sunt grele sau usoare, si nici stresante sau nu, sunt intrebari pur si simplu.
Orice programator trece printr-un proces de invatare a limbajului. E nevoie de ceva timp si de o abordare organizata pentru a ajunge la un nivel de baza, nivel la care cel putin o serie de termeni sa fie cunoscuti si o serie de tehnici sa fie insusite.
Am incercat sa-ti prezint un minim de elemente, cele strict necesare pentru realizarea temei.
Pentru asta am ales sa definesc eu o parte din aplicatie, ca sa ai un exemplu functional, exemplu pe care sa-l explorezi si sa intelegi cum functioneaza, si pe care sa putem discuta.




Daniel Buduru
 3/9/2010 12:03:16 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
 GooDy wrote
acum avem :

combo1 care va trebui populat cu titlul cartilor : RowSource :  SELECT titlu, IDcarte FROM carte ORDER BY 1 INTO CURSOR crsCombo1
avem text1,text2,text3 acestea trebuiesc completate in metoda onlistchange a form-ului ...dar : text1 - dimprumut | text2 - dtermen | iar text3 - va trebui sa fie dreturn ..corect ? ...dar nu avem dreturn in list1 deci va trebui lasat necompletat in metoda onlistchange .


In metoda OnListChange punem campurile necesare in controlsource al fiecarui obiect.
Aceste campuri le luam dintr-un cursor, pe care il obtinem din tabela de baza, pe baza cheii primare obtinute de la list1.
Scrie aici comanda select pe care o vom folosi pentru asta.
Combo1 va trebui populat cu titul si id-ul cartilor, dar unde la va pune combo1 dupa ce se selecteaza o carte?
Text3 nu va trebui lasat necompletat, chair daca nu exista in cursorul listei. Ai sa vezi ca gasesti o solutie si pentru asta.

Daniel Buduru
 3/9/2010 12:41:13 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
codul pentru onlistchange :

SELECT * FROM imprumut Where idimprumut=(thisform.ListValue) INTO CURSOR crsimprumut
Thisform.text1.ControlSource="crsimprumut.dimprumut"
Thisform.text2.ControlSource="crsimprumut.dtermen"
Thisform.Refresh

( aici am o mica problema , daca abonatul are imprumutata decat o singura carte eu nu am cum sa ma plimb prin lista deci automat nu se face actualizarea in text-uri , daca are 2 sau mai multe carti text-urile cu dimprumut si dtermen se actualizeaza )

 3/9/2010 12:45:25 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
In primul rand, cum actualizam idcarte?
Apoi, de ce nu actualizam si dreturnare?
Daca nu-ti ajung textbox-urile, mai pui.

Cand selectezi abonatul si se populeaza lista, textbox-urile nu afiseaza nimic?


Daniel Buduru
 3/9/2010 12:46:29 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
o mica rectificare , pentru a-mi actualiza si combo-ul trebuie sa avem :

SELECT * FROM imprumut Where idimprumut=(thisform.ListValue) INTO CURSOR crsimprumut
Thisform.combo1.ControlSource="crsimprumut.idcarte"
Thisform.text1.ControlSource="crsimprumut.dimprumut"
Thisform.text2.ControlSource="crsimprumut.dtermen"
Thisform.Refresh
 3/9/2010 12:49:57 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
off : cum pot edita posturile ?

rectificare :

SELECT * FROM imprumut Where idimprumut=(thisform.ListValue) INTO CURSOR crsimprumut
Thisform.combo1.ControlSource="crsimprumut.idcarte"
Thisform.text1.ControlSource="crsimprumut.dimprumut"
Thisform.text2.ControlSource="crsimprumut.dtermen"
Thisform.text3.ControlSource="crsimprumut.dreturnare"
Thisform.Refresh

Cand selectezi abonatul si se populeaza lista, textbox-urile nu afiseaza nimic?
nu , trebuie sa selectec din lista ca se sa faca actualizarea !

 3/9/2010 12:57:46 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
In cboAbonat.Click ai si thisform.list1.Listindex=1?

In list1.programmaticChange ai this.InteractiveChange?


Daniel Buduru
 3/9/2010 1:02:53 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
in cboAbonat.click aveam thisform.list1.listindex=1
dar in programmaticChange nu aveam acel this.InteractiveChange ....

am pus si acum functioneaza perfect :)
 3/9/2010 1:11:51 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A) Modified By Daniel Buduru  on 3/9/2010 1:13:09 PM)
Evenimentul InteractievChange al unui obiect apare la modificarea interactiva a valorii, deci din mouse sau tastatura.
ProgrammaticChange apare la modificarea valorii  prin cod, ceea ce face comanda List.listIndex=1.
Pentru ca obiectul sa se comporte la fel atat la modificarea interactiva cat si la cea prin program, trebuie ca una din metode sa o apeleze pe cealalta.

Modifica la fel si celelalte formuri care folosesc lista.

Daniel Buduru
 3/9/2010 1:16:54 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Ce conditii vom pune in OKToSave? In ce situatie nu permitem salvarea unei inregistrari in imprumuturi?


Daniel Buduru
 3/9/2010 1:23:13 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201a
 (N/A)
Trebuie sa verificam daca :
-  inregistrarea nu este goala , verificam pe dimprumut
- verificam daca dimprumut este in tabela

 3/9/2010 1:28:27 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201a
 (N/A)
Nu verificam daca mai este vreun exemplar pe raft? Daca sunt date toate?


Daniel Buduru
 3/9/2010 2:06:33 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201ac
 (N/A)
corect .... ca sa stim daca avem ce sa imprumutam sau nu . dar mai verificam daca  inregistrarea este goala ?
 3/9/2010 2:25:10 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201ac
 (N/A)
Ordinea in care facem verificarile este cea in care nu scriem cod inutil
Daca inregistrarea e goala, deci nu avem un idcarte, e inutil sa verificam daca o carte care nu exista are cumva stoc.
Pe de alta parte, vei vedea, cand vei testa acest form, ca, odata intrat pe combo, nu il poti lasa pe o inregistrare goala. Fiind un drop-down combo, poate afisa doar valori din lista.
Ca sa stergi continutul campului din controlsource, neputand sa selectezi o valoare goala in combo, trebuie sa o faci prin cod.
Pentru asta, combo trebuie facut sa se comporte ca un textbox, atunci cand vrei sa ii stergi continutul.
Deci, trebuie sa scriem un cod care, la apasarea tastei Del, sa stearga continutul campului din ControlSource.
Daca te uiti la evenimentele unui combobox, in care dintre ele crezi ca am putea pune acest cod?

Daniel Buduru
 3/9/2010 2:28:07 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201ac
 (N/A)
Ca sa nu parasim cu totul discutia despre verificarile dinaintea salvarii, ce alte verificari ar trebui sa mai facem, in afara de inregistrarea goala si de stoc?
Ce modificari ar putea face utilizatorul asupra unei inregistrari existente si pe care dintre ele nu ar trebui sa le permitem?




Daniel Buduru
 3/9/2010 2:38:49 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201ac
 (N/A)
clear ?

nu ar trebui sa verificam , ca dtermen sa fie mai mare decat dimprumut ?
 3/9/2010 2:48:59 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201ac
 (N/A)
Combo.Clear sterge continutul unui combo (la fel si la list) daca rowsourcetype=0
Ne trebuie ceva care sa reactioneze la tastare.

Desigur, dtremen >dimprumut
Textbox-urile  in care se afiseaza dimprumut si dreturnare nu trebuie sa permita modificarea. Dimprumut si dreturnare vor preula data curenta a sistemului, nu lasam operatorul sa o introduca.
Cum vom face cand se returneaza o carte, daca nu dam voie sa se scrie data ci doar o preluam??

Mai avem insa doua situatii "sensibile":
- Modificarea cartii imprumutate.
- Stergerea unui imprumut "deschis", la care inca nu s-a returnat cartea.
Ce ar trebui sa facem in aceste situatii?






Daniel Buduru
 3/9/2010 2:55:17 PM
User is offlineGooDy
194 posts
5th


Re: Atestat 201ac
 (N/A)
normal ar trebui modificat titlul carti si gata , dar , in momentul cand o carte este imprumutata dstoc (stocul disponibil ar trebui sa se miscoreze cu 1 ) , daca am schimba titlul cartii s-ar amesteca dstoc si ar iesi o harababura .
imprumutul sa fie sters dar sa se actualizeze si tstoc care va avea -1 carti .
 3/9/2010 3:02:56 PM
User is offlineDaniel Buduru
2142 posts
1st




Re: Atestat 201ac
 (N/A)
Cel mai simplu este sa nu permitem modificarea titlului.
Daca s-a gresit inregistrarea, se returneaza si apoi se sterge.

Cum ramane cu combo?

Daniel Buduru
  Visual FoxPro  Visual FoxPro in general  Atestat 2010...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement