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  Pack in Cursor...
 Pack in Cursor
 
 9/14/2009 10:14:09 AM
User is offlineEugen Gliga
1052 posts
1st




Pack in Cursor
 (N/A)
Comanda PACK, aplicata unui cursor, produce eroarea "Invalid operation for the cursor". Dupa aplicarea unei comenzi Alter Table asupra cursorului, comanda PACK nu mai este o operatie invalida. Sa inteleg, ca dupa aplicarea comenzii ALTER, cursorul se transforma in tabela ?





 9/15/2009 10:11:44 AM
User is offlineaflorin
840 posts
1st


Re: Pack in Cursor
 (N/A)
In fapt, atunci cind dai un SELECT ... INTO CURSOR VFP creaza pe disc un fisier cu extensia .tmp si cu structura de tabela. Deci nu ar fi de mirare comportamentul descris.

Stiu ca, inainte de VFP 8 si clauza READWRITE, faceam asa:
- memoram numele si calea acestui fisier temporar cu functia DBF()
- dadeam USE
- apoi USE variabila EXCLUSIVE
si obtineam un cursor READWRITE si EXCLUSIVE.

Florin Aparaschivei - Iasi
 9/15/2009 11:11:03 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Pack in Cursor
 (N/A)
Am folosit si eu artificiul asta. Nu stiu daca dupa redeschidere este tot cursor sau este tabela pt ca nu se stie exact diferenta interna dintre cursor si tabela.
In cazul meu folosesc un cursor pt preluare date intr-un grid iar uneori am de sters sau de inserat linii. Este mult mai usor sa sterg o linie si apoi sa dau pack decat sa gestionez liniile goale si sa le reutilizez. Faptul ca initial nu am putut folosi comanda Pack in cursor mi-a complicat mult codul.


 9/15/2009 11:25:46 AM
User is offlineaflorin
840 posts
1st


Re: Pack in Cursor
 (N/A)
Pentru prelucrari de genul acesta, eu aveam un folder .\Thrash in directorul aplicatiei, si aduceam acolo datele cu INTO TABLE. La inchiderea aplicatiei curatam acest folder.
Am insa o vaga impresie ca VFP are niste optimizari pe cursoare, in sensul ca nu pune chiar totul pe disc din prima, deci mai putin I/O.

Florin Aparaschivei - Iasi
 9/15/2009 11:28:51 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Pack in Cursor
 (N/A)
 Eugen Gliga wrote
In cazul meu folosesc un cursor pt preluare date intr-un grid iar uneori am de sters sau de inserat linii. Este mult mai usor sa sterg o linie si apoi sa dau pack decat sa gestionez liniile goale si sa le reutilizez. Faptul ca initial nu am putut folosi comanda Pack in cursor mi-a complicat mult codul.


Un cursor cu buffering=5 (table buffering) poate rezolva mai simplu problema. Pentru a elimina o inregistrare e suficienta o comanda TABLEREVERT(.f.). La sfarsitul editarii, TABLEUPDATE(.T.) comite bufferul in cursor.


Daniel Buduru
 9/16/2009 3:41:39 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Pack in Cursor
 (N/A)
Interesanta solutie. Face cam acelasi lucru cu Pack, adica rezolva problema eliminarii unei inregistrari din cursor si renumeroteaza inregistrarile ramase.

Ar mai fi o problema. Cea a inserarii unei pozitii in interiorul cursorului. Solutia pe care am gasit-o nu mi se pare prea eleganta. Mai exact, merg pe pozitia respectiva si dau un Copy to Array While !Eof(), dupa care revin pe aceeiasi pozitie si fac un ciclu Do While !Eof() cu Tablerevert(.f.) in interior. Urmeaza Insert pozitie noua si Append from Array. Alta solutie ar fi sa fac un Insert la sfarsitul tabelei si apoi sa permut continutul inregistrarilor intr-un ciclu de la coada spre inceput, folosind Scatter si Gather. Poate ai o solutie mai simpla la aceasta problema.
 9/16/2009 8:19:24 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Pack in Cursor
 (N/A)

Ar fi si Copy to Array intregul cursor, redimensionare array, inserare linie, zap pe cursor sau tablerevert(.t.), append from array.

Sau solutia urmatoare care, spre deosebire de array, nu e limitata la numarul de elemente :

CREATE CURSOR cc (f1 i, poz i)
CURSORSETPROP("Buffering",5)
FOR ii=1 TO 20
INSERT INTO cc (f1) VALUES (ii)
next
BROWSE LAST
SET SQLBUFFERING ON
GO
7
lnpoz=
ABS(RECNO()) && Inregistrarile adaugate in buffer au recno() negativ
SELECT ABS(RECNO()) as rec, * FROM cc WHERE ABS(RECNO())<lnpoz INTO CURSOR cx ORDER BY 1
SELECT ABS(RECNO()) as rec, * FROM cc WHERE ABS(RECNO())>=lnpoz INTO CURSOR cy ORDER BY 1
TABLEREVERT(.t.,'cc')
INSERT INTO cc (f1, poz) SELECT f1, rec FROM cx
APPEND BLANK IN cc
INSERT INTO cc (f1, poz) SELECT f1, rec FROM cy
SELECT cc
BROWSE nowait
SET SQLBUFFERING OFF &&daca e cazul

 


Daniel Buduru
 9/17/2009 11:20:29 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Pack in Cursor
 (N/A)
Multumesc pt solutii. Sunt frumoase amandoua. O sa aleg totusi prima solutie pt ca mi se pare mai scurta iar cursoarele in cauza nu depasesc 1000 de inregistrari.

 9/17/2009 11:36:28 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Pack in Cursor
 (N/A)
Varianta SQL are (cel putin) un avantaj: e independenta de ordinea campurilor din cursor.

Daniel Buduru
 9/18/2009 1:36:33 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Pack in Cursor
 (N/A)
N-am inteles de ce ar fi dependenta cealalta varianta de ordinea campurilor in cursor.
Am incercat ceva de genul:

Set Multilocks On
Create Cursor Test (C1 c(10),C2 c(10),C3 c(10))
CursorSetProp("Buffering", 5)
For ii=1 To 20
    Insert Into test (C1,C2,C3) Values ("Col1 Lin"+Transform(ii),"Col2 Lin"+Transform(ii),"Col3 Lin"+Transform(ii))
Endfor
Brow
Copy To Array aaa
Tablerevert(.T.)
nRow=Alen(aaa,1)
nCol=ALEN(aaa,2)
Declare aaa[nRow+1,nCol]
Ains(aaa,11) 
aaa[11,1]="Col1 NEW"
aaa[11,2]="COl2 NEW"
aaa[11,3]="COl3 New"
INSERT INTO test FROM ARRAY aaa
Brow

 9/18/2009 10:26:30 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Pack in Cursor
 (N/A)
 Eugen Gliga wrote
N-am inteles de ce ar fi dependenta cealalta varianta de ordinea campurilor in cursor.


aaa[11,1]="Col1 NEW"
aaa[11,2]="COl2 NEW"
aaa[11,3]="COl3 New"

Fiecare element din linie trebuie completat cu campul corespunzator. 
Chiar si in cazul inserarii unei linii goale in array, elementele din aceasta linie trebuie initializate cu tipul campului corespunzator.
Scindarea vectorului in doua si inserarea liniei noi direct in cursor elimina necesitatea cunoasterii ordinii campurilor.

Inteleg ca inserarea unei linii in cursor, intr-o anumita pozitie, e o cerinta a tipului de aplicatie.
In acest caz, eu m-as orienta spre o rezolvare generica, o procedura care ar primi ca argument aliasul cursorului si numarul liniei care trebuie inserate si care ar returna cursorul pozitionat pe inregistrarea goala inserata.

Daniel Buduru
 9/18/2009 6:47:05 PM
User is offlineEugen Gliga
1052 posts
1st




Re: Pack in Cursor
 (N/A)
Pai asa m-am si orientat. O comanda pe pozitia respectiva, apeleaza o metoda care intoarce cursorul pe inregistrarea goala  inserata. Inca o data, multumesc pt ajutor.


  Visual FoxPro  Baze de date, tabele, view-uri si indecsi  Pack in Cursor...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement