Search  
Friday, May 25, 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  Baze de date, tabele, view-uri si indecsi  problema legata...
 problema legata de autoincementare
 
 2/24/2011 11:33:04 AM
User is offlineJohnnyPK22
31 posts


problema legata de autoincementare
 (N/A)
As avea o mica intrebare ...
La un form am pus sa imi afiseze un nr autoincementat. Acest numar il iau dintr-un tabel ...

Problema este urmatoarea .. eu chiar si atunci cand anulez formul(ori prin butonul cancel, ori de la X) el trece la urmatoarea valoare ... cum as putea face, ca atunci cand dau cancel/exit sa imi reseteze acel nr la valoarea precedenta.

m-am gandit la ceva de genul

IF tablerevert = .t. then
     nr.value = nr.value - 1
else
     return nr.value
endif

ar fi corect un cod de genul asta ? si unde ar trebui sa il pun ? la ce metoda ?


 2/24/2011 11:50:50 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A) Modified By Daniel Buduru  on 2/24/2011 12:51:20 PM)
Nu poti anula valoarea generata intr-un camp autoincrement, chiar daca abandonezi inserarea inregistrarii. (tablerevert).
Daca vrei se generezi o secventa de numere consecutive, campul autoincrement nu te ajuta.

Exista mai multe metode pentru generarea unei astfel de secvente.
Poti avea un tabel in care sa tii secventa - primul numar din secventa, ultimul numar din secventa, increment, numarul curent.
Pentru a evita situatia in care abandonezi editarea iar numarul ramane generat, ai doua variante:
1. Utilizarea tranzactiilor si buffering  pesimist pe tabela cu numere.
2. Alocarea numarului chiar la salvarea inregistrarii. Pentru asta, faci alocarea intr-o procedura apelata in functia record valid a tabelei in care utilizezi numarul.

Daniel Buduru
 2/24/2011 12:11:08 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
cum as putea face a 2-a varianta ?

cea cu alocarea ?
 2/24/2011 1:14:07 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A) Modified By Daniel Buduru  on 2/24/2011 9:21:06 PM)
Ai nevoie de o tabela in care tii secventele, sa zicem seqnum.
In aceasta tabela ai campurie tip_document, nrstart, nrend, increment, nrcrt.
In baza de date creezi o functie, sa-i zicem  docnum
Function setdocnum
if getfldstate(-1) <>4 &&verifici daca este adaugare de inregistrare 
if getfldstate(field('nr')) <>4 &&verifici daca este adaugare de inregistrare
  return
endif
local ludoctip, lndocnum, lanum[1]
ludoctip=tip_document &&tipul de document pentru care ceri numar
update seqnum set nrcrt=nrcrt+1 where tip_document=luDocTip
select nrcrt from seqnum where tip_document=ludocnum into array lanum
if empty(lanum(1))
   Messagebox("Eroare la alocarea numarului")
   return .f.
endif
replace nrdoc with lanum
endfunc

Apoi deschizi tabela in editare structura, mergi la pagina Table si pui, la record validation rule, setdocum().

Mai ai de pus cod pentru tratatrea erorilor, verificarea existentei unei secvente active pentru tipul de document, verificarea validitatii documentului inainte de a-i aloca un numar.
Daca vrei sa verifici validitatea doumentului, faci o functie pentru asta. Sa zicem ca ai tabela facturi. Pui in stored procedure functia facturi_valid:

Function Facturi_valid
if isnull(evl(idclient, null)) or isnull(evl(data_doc,null) or isnull(evl(val_tot,null))
  return .f.
endif
endfunc

In tabela facturi, la record validation rule, pui
facturi_valid() and setdocnum()
Va fi evaluata mai intai validitatea inregistrarii, si numai daca e valida se trece la alocarea numarului de factura.

Daca in tabela nu ai un camp tip_document, poti trimite tipul document ca parametru in functia setdocnum.



Later Edit: corectat getfldstate(-1), care returneaza string



Daniel Buduru
 2/24/2011 1:51:58 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
Cand spui sa creez o functie in baza de date te referi la o metoda in form-ul meu, la adugarea unui nou fisier .prg si sa pun functia acolo ?

Iar partea de stored procedure nici macar nu am gasit-o ... :(

Folosec visual foxpro 9 ...

Deci sa mai explic putin ... Am un form("listabon") unde am un grid, aici imi este afisat tabelul meu. Daca dau click dreapta in tabel pot adauga o optiune ... daca aleg asta, imi va mai aparea un form("bon") ... aici, pe formul acesta, bon, am un textbox care este legat la un camp din tabel(mai exact la "nr"). Am facut nr sa fie integer(autoincrement) dar cand dau cancel in formul "bon" si apoi deschid iar formul, imi apare valoarea incrementata ... mentionez ca in tabel nu apare ... daca dau cancel nu imi va afisa inregistrarea in tabel(adica in form-ul "listabon")


PS: dc am nevoie de tipul documentului ?

 2/24/2011 1:58:14 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
tabela mea este ceva de genul :

"bon" -> id, nr, databon, nume, prenume, etc ...

id e pus PK ... iar nr vreau sa fie autoincrementat si sa nu mai fie inregistrat cand dau cancel/exit
 2/24/2011 2:50:20 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A)
Stored Procedures apartin bazei de date. Sunt functii si proceduri continute in baza de date.
Daca deschzi baza de date in editare (Modify database ..), in menu vei vedea un pad Database, iar in popup=ul asociat acestuia acesta vei gasi un bar Edit Stored Procedures.

Ti-am explicat in primul post ca nu poti folosi autoincrement pentru numarul bonului - numarul se incrementeaza ori de cate ori se adauga o inregistrare in tabela, chiar daca abandonezi adaugarea (dai cancel). Numarul a fost deja generat cand s-a cerut inregistrare noua. Cand dai cancel, inregistrarea nu se salveaza, dar numarul ramane generat.

De tipul documentului ai nevoie daca vrei sa generezi numere pentru mai multe feluri de documente: facturi, avize, bonuri, etc. Elimina campurile de care nu ai nevoie.

Cauta in help Stored Procedures.

Daniel Buduru
 2/24/2011 2:56:15 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A) Modified By Daniel Buduru  on 2/24/2011 3:56:53 PM)
 JohnnyPK22 wrote
.....
id e pus PK ... iar nr vreau sa fie autoincrementat si sa nu mai fie inregistrat cand dau cancel/exit

Pentru asta ar trebui sa modifici in headerul tabelei ultimul numar generat, ori de cate ori abandonezi o adaugare in tabela. Comanda ALTER TABLE are clauze cu care poti face asta, daca tii neaparat, dar nu in modul asta rezolvi problema.

Daniel Buduru
 2/24/2011 3:24:29 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A)
Mai sunt si alte posibilitati, daca vrei neaparat campul autoincrement:
- lucrezi cu un view actualizabil sau cursoradapter - acestea insereaza inregistrarea doar la tableupdate, si nu declanseaza generarea unui nou numar inainte de tableupdate.
- renunti la adaugarea inregistrarii noi direct in tabela si faci un INSERT INTO cu datele necesare cand userul da comanda save.

Daniel Buduru
 2/24/2011 5:08:39 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
pentru proiectul meu am nevoie de validitate si tip document ?

la mine pur si simplu fac un raport bazat pe inregistrarile din tabel ... nu am legaturi intre tabele ..
la formul boncmd(form pentru adaugarea datelor in tabel) am facut legaturile cu acelasi tabel ca pentru formul bon(form unde pot vizualiza si alege ce vreau sa fac <<adaug,sterg,printez>>)

nu prea ma descurc, am incercat sa adaptez codul si sa fac metode ... dar nu imi iese :(
 2/24/2011 5:45:14 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
nu ma descurc deloc cu varianta asta :(

Prima metoda cu transaction este mai simpla ?
 2/24/2011 6:12:35 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A)
Daca pe form ai doar adaug, streg printez, cum faci abandonul? Cancel?

La nivelul la care esti in vfp nu exista nici o varianta simpla. Sorry.


Daniel Buduru
 2/24/2011 6:32:04 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
cand selectez sa editez o inregistrare imi va deschide un nou form (boncmd) ... si aici pot da OK sau CANCEL ...
e acelasi form si pentru adaugare ... doar ca la adaugare l-am facut sa nu mai preia date din tabel ...

apropo ca buffer am folosit metoda 5 - optimistic table buffering ...

deci am facut asa ... am creat o noua tabela, "seqnum" cu nrstart(C10), nrend(C10), increment(C10),nrcrt(C10), tip_document(10)
apoi m-am dus in baza de date(la mine se cheama "formular") si m-am dus la stored procedures unde am pus functia SETDOCNUM ....
am deschis iar tabela "seqnum" si am adaugat la proprietatile tabelei la regula setdocnum() ...

si primesc erori...

La functia SETDOCNUM

ma duce la

if getfldstate(-1) <>4  &&de la ce e 4 ? dc sa fie diferit de 4 ?

altceva ar mai trebui sa fac ceva ?
 2/24/2011 6:37:05 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
Poti te rog sa imi explici pas cu pas ce ar trebui sa fac eu in situatia mea ? Nu reusesc sa il fac sa mearga ... ori imi da erori, ori nu face nimic :(

 2/24/2011 7:44:02 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A) Modified By Daniel Buduru  on 2/24/2011 9:21:25 PM)
 JohnnyPK22 wrote
cand selectez sa editez o inregistrare imi va deschide un nou form (boncmd) ... si aici pot da OK sau CANCEL ...
e acelasi form si pentru adaugare ... doar ca la adaugare l-am facut sa nu mai preia date din tabel ...

apropo ca buffer am folosit metoda 5 - optimistic table buffering ...

deci am facut asa ... am creat o noua tabela, "seqnum" cu nrstart(C10), nrend(C10), increment(C10),nrcrt(C10), tip_document(10)
apoi m-am dus in baza de date(la mine se cheama "formular") si m-am dus la stored procedures unde am pus functia SETDOCNUM ....
am deschis iar tabela "seqnum" si am adaugat la proprietatile tabelei la regula setdocnum() ...

si primesc erori...

La functia SETDOCNUM

ma duce la

if getfldstate(-1) <>4  &&de la ce e 4 ? dc sa fie diferit de 4 ?

altceva ar mai trebui sa fac ceva ?


Uita-te inca o data la postul in care ti-am dat codul si vezi acolo in ce tabela trebuia sa treci regula.

De ce ai facut caracter campurile legate de numar document? Ca sa treci prin transformari de tip cand vrei sa incrementezi?

"Primesc erori" nu e nici un fel de informatie. Daca vrei sprijin, spune ce cod de eroare, ce mesaj, la ce linie din cod. Altfel, ignor complet postul.

Pentru Getfldstate te-ai uitat in help? de ce sa diferit de 4?
Eroarea vine de la tip, am uitat ca getfldstate(-1) returneaza caracter.
Pune  IF GETFLDSTATE(field('nr'))<>4





Daniel Buduru
 2/24/2011 7:44:38 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A)
 JohnnyPK22 wrote
Poti te rog sa imi explici pas cu pas ce ar trebui sa fac eu in situatia mea ? Nu reusesc sa il fac sa mearga ... ori imi da erori, ori nu face nimic :(


Posturile cu "imi da erori" se ignora.

Daniel Buduru
 2/24/2011 8:09:39 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A) Modified By Daniel Buduru  on 2/24/2011 9:32:36 PM)
In seqnum pune campurile de tip integer (in afara de tip_document, care poate fi caracter).
Scoate ce i-ai pus la recordvalid.
Adauga o inregistrare,  pune nrstart=1, nrend= 10000, increment =1

In tabela in care tii bonul pune la record validation rule setdocnum()

Function SETDOCNUM
IF GETFLDSTATE(Field('nr'))<>4 && se aloca numar doar daca este inregistrare nou adaugata
IF AT('4',getfldstate(-1))=0
   Return
ENDIF
local lnArea
lnArea=select()
Update seqnum Set nrcrt=evl(nrcrt, nrstart)+increment
select (lnArea)
Replace nrbon with seqnum.nrcrt
Endfunc

Edit: Am reusit sa ma enervez bine de la "da erori" si n-am mai fost deloc atent la ce scriu.

Daniel Buduru
 2/24/2011 9:01:43 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
wow .... merge :) esti un zeu :) ... mii de multumuri ....

singura problema care o mai am e ca nu imi vede in form-ul de completare numarul bonului ... in tabel imi face inregistrarea cum trebuie ...

eu m-am gandit sa adaug si tabela seqnum la formul respectiv ... si am facut legatura textboxului cu "seqnum.nrcrt" .... si am nevoie sa ii adaug + 1 ... pot sa fac asta din proprietati direct ?

daca nu se poate asa direct ... o sa il scot, ca nu e nevoie oricum daca e generat automat, era mai mult de design ...

m-ai ajutat enorm si iti raman dator ... mi-au iesit peri albi cu problema asta :) ...

multumesc inca o data

 2/24/2011 9:35:16 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A)
Numarul bonului nu iti apare pentru ca inca nu este alocat.
Daca vrei sa apara in textbox, pune-i in controlsource (seqnum.nrcrt+1), dar nu ar trebui sa te legi de asta. Oricum, numarul apare la tiparire, utilizatorul nu are ce face cu el cand emite bonul.



Daniel Buduru
 2/24/2011 10:32:48 PM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
mersi ... a mers ... eu puneam fara paranteze ... si imi dadea eroare si am crezut ca poate nu pot sa il pun direct :) .. oricum era mai mult de design :)

dar nu mai merge cum trebuie :) ... cand intru sa editez imi arata nr urmator pt bon si nu imi mai arata nr de la bonul curent ... iar daca il pun (bon.nr) ... imi arata numarul corect al bonului, dar cand dau adaugare, imi arata 0 :)) ...

cred ca am sa il scot sa nu ma mai complic degeaba  :)
 2/24/2011 11:15:01 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: problema legata de autoincementare
 (N/A)
Schimba-i controlsource pe (seqnum.nrcrt+1) cand intri in adaugare si revino la bon.nr dupa salvare sau cancel.

Daniel Buduru
 2/25/2011 2:13:39 AM
User is offlineJohnnyPK22
31 posts


Re: problema legata de autoincementare
 (N/A)
l-am sters din form :) ... oricum nu prea isi avea rostul... pentru ca in tabel afisez oricum nr ala ...

mersi inca o data pentru tot ajutorul ....

m-ai ajutat enorm ...
  Visual FoxPro  Baze de date, tabele, view-uri si indecsi  problema legata...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement