Corect - formatarea grid-ului se distruge pentru ca ii iei datele de sub nas. E by design.
ThisForm.Grid.RecordSource = ""PackThisForm.Grid.RecordSource = "tabela"
In versiunle anterioare de VFP (pana la 8 inclusiv), Grid.RecordSouce = "" pastra .ControlSource pentru coloane. In VFP9 nu; daca faci manevra asta pe un grid care are coloanele asignate "pe sarite", este posibil sa constati ca dupa reasignarea lui RecordSource coloanele din grid afiseaza alte coloane din tabela decat inainte.
Eu as face o metoda Assign pe proprietatea RecordSource, si in ea as scrie codul care formateaza grid-ul.
Cum solutia lui Grig este cea fiabila, pentru a nu taia V din VFP, eu mi-am facut o mica functie care genereaza codul pentru formatarea grid-ului pornind de la gridul aranjat cu truda in designer :)
*!*Get grid columnsLPARAMETERS toGrid, tlClipboardIF VARTYPE(toGrid)<>"O" OR toGrid.baseclass<>'Grid' LOCAL ARRAY a1[1] ASELOBJ(a1) toGrid=a1[1] IF VARTYPE(toGrid)<>"O" OR toGrid.baseclass<>'Grid' RETURN endif ENDIF
LOCAL i, lctext, loColumn SET textmerge TO memvar lctext noshowSET TEXTMERGE onlcAlias=toGrid.recordsource\*!* getGridColumns\Lparameters oGrid, lcAlias\oGrid.RecordSource=lcAliasFOR i=1 TO toGrid.columncountloColumn=toGrid.Columns(i)\oGrid.<<TRANSFORM(loColumn.Name)>>.controlsource="<>"\oGrid.<<TRANSFORM(loColumn.Name)>>.Header1.Caption="<>"\oGrid.<<TRANSFORM(loColumn.Name)>>.Width=<<TRANSFORM(loColumn.Width)>>ENDFORSET TEXTMERGE offSET TEXTMERGE toIF tlClipboard _cliptext=lcTextendif RETURN lcText
In grid - sau in form, sau unde doresti - pui o metoda (SetGridSource, i-am zis eu) in care pui codul returnat de functia de mai sus, metoda pe care o apelezi fie din grid.RowSource_assign, cum a sugerat Grig, fie de unde ai tu nevoie ...
Sorry ... Ceva a scapat . Am inteles ce :) HTML a taiat ce era intre ghilimele duble + < < . Am pus paranteze drepte si nu mereg nici asa :)
Codul corect este atasat
Cand au aparut metodele _Access si _Assign (in VFP 6) am crezut ca se aplica numai proprietatilor definite de programator; ca atare am fost foarte suprins sa vad ca poti sa definesti metode _Assign si _Access tuturor proprietatilor, indiferent daca sunt native sau custom. M-am bucurat tare :)
Metodele astea se creeaza deschizand clasa in Class Designer, te duci in meniul Class, Edit Property/Method, in fereastra care apare selectezi proprietatea care te intereseaza si dai bifele la "Access method" si "Assign Method". Cand dai Ok, class designer-ul va crea doua metode care se numesc la fel ca si proprietatea, dar au in plus _acces, si respectiv _assign. Metodele se executa automat ori de cate ori citesti, respectiv scrii proprietatea aia.
In cazul tau, un Assign pe RecordSource se va numi RecordSource_Assign, si se va executa ori de cate ori vei face Grid.RecordSource = "numetabela" sau ="". In metoda assign primesti ca parametru valoarea care va fi scrisa in proprietate (inainte de a fi scrisa; in momentul executiei metodei Assign proprietatea are inca vechea valoare). Si de-aici incolo e cale batuta: If Not Empty(Alltrim(vNewVal));This.RecordSource = vnewval, this.column1.controlsource = "ceva", s.a.m.d.
In felul acesta poti sa iti formatezi grid-ul prin simpla asignare a lui recordsource. O chestiune de design: daca ai nevoie sa-ti formatezi grid-ul si din alta parte (programatic, din vreo metoda, ceva), e o idee buna sa faci o metoda distincta (FormatGrid, de exemplu) pe care sa o apelezi de oriunde (inclusiv din RecordSource_Assign).
Nota: Mi se pare ca era si un bug la Assign, legat de niste proprietati native (de genul lui Width, daca nu ma insel). Dorin Vasilescu stie mai multe despre asta - eu nu am folosit Assign pe Width.
Un ultim lucru, inainte de a inchide: Daca vrei sa fortezi executia unei metode assign, este suficient sa scrii intr-o proprietate chiar proprietatea, astfel:
This.RecordSource = This.RecordSource.
Imi pare rau, Dan. TextProvider-ul din DNN e idiot si n-am ce sa-i fac :((
Scuze ca ma bag si eu aici cu alta problema dar tot de acelasi lucru tine
Afisarea datelor in grid
Am un form in care am 1 pageframe, in acel pageframe am un textbox si un command button pe pagina 1 si un grid pe pagina 2.
textboxul este o conditie de filtrare asupra unui tabel intr-un server sql ..gen ...where name like " '%"+alltrim(thisform.pageframe1.page1.text1.value)+"%' "
buttonul de search apeleaza event click al pagini 2 din pageframe unde este pus commanda sql si umplerea gridului cu date.
Totul merge PERFECT la prima cautare, la a doua ..nu mai vad cursorul in grid cu toate ca datele sunt corecte in grid nu vad pe ce date e pozitionat cursorul, mai mult daca misc cu sageata in sus, jos...imi da peste cap afisarea gridului.
Am gasit si solutia...dar...solutia este ca la fiecare search sa recreez gridul run-time cu addobject...
totul este ok..dar..in prima situatie mai aveam un highlight pe row cu pricina in care ma aflam..si care era reimprospatat de "AfterRowColChange" al grid'ului ...ce a ce in situatia 2 nu mai e valabil datorita faptului ca grid'ul care contine codul la afterrowcolchange este distrus si creat un grid nou
Intrebarile sunt:
1. Cum pot scapa de problema de afisare in prima situatie ?
2. Cum pot run-time sa complectez cu cod un event al unui obiect create run-time ?
Ms..eventual mai postez lamurir in cazul in care e nevoie
Inteleg ca foloseti SPT pt citirea datelor.
Incearca sa folosesti un cursoradapter parametrizat, iar la apsarea butonului definesti valoarea parametrului cu alltrim-ul de care spuneai,.
In final, folosesti REQUERY() pentru aplicarea noii filtrari in click-ul butonului. Astfel, cursorul nu se va inchide.
Rares
Ce a ce am uitat sa spun...
daca dau click pe "page 2" si nu pe button...merge de fiecare data...dar e stupid...
butonu apeleaza page2.click ..daca dau de la buton afisare in grid e aiurea ..daca dau de la page2 (dau click pe el) afisarea e corecta de fiecare data....
deci nu e problema cu requery()...
----------------
Cum adica "iti da peste cap" afisarea grid-ului? ce intelegi prin "iti da peste cap"? incearca sa descrii problema, nu sa ne lasi pe noi sa ne imaginam ce vezi tu. Ai useri? Pe tine nu te enerveaza cand te suna si-ti spun ca, citez: "a sarit mouse-ul in ribon"? Descrie problema corect, daca vrei o sugestie corecta.
La intrebarea 1, nu te pot ajuta, desi as vrea. Revino cu detalii.
2: Nu se poate sa scrii cod intr-o metoda sau intr-un eveniment in runtime. In schimb poti face urmatorul lucru (in runtime): StrToFile("codul tau","fisier.prg"); Compile fisier.prg, iar apoi BindEvent() intre metoda/evenimentul unde ai fi vrut sa fie codul si "fisier.fxp", rezultat in urma compilarii.
deci..
problema e in felul urmator
daca actionez page2 de la pageframe din buton cu pageframe.page2.setfocus nu mai vad corect datele in grid care se afla pe page2 in schimb daca dau click eu pe page2 atunci grid este afisat corect ..normal cu setfocus nu ar trebui sa fie acelasi lucru ca si cind dau eu click pe page2 si sare focusul acolo ?
eventual o sa postez si formul cu pricina
mediul este vfp 7.0
Ai niste cod in Activate la pagina2? si ce intelegi prin "cu mai vad corect datele din grid"? Zi frate ce-i cu alea.... dispar? grid alb? alte date decat alea care trebuie? Acolo e problema, la codul care populeaza grid-ul, ca nu altfel nu insistam eu de nebun.
Cele doua actiuni ar trebui sa faca acelasi lucru. Daca nu-l fac, inseamna ca ai niste cod care cand se executa cand nu. Indicatia despre CE SE INTAMPLA IN GRID este utila si de aia ti-o tot cer. Si tu tot eviti sa spui clar.
man..
gridul e un tabel...in care sunt date ..
in mod normal cind te plimbi cu sageti prin el este selectat un "cell" cu albastru...si se misca datele in functie de cum te misti cu sagetile.
la mine nu se mai selecteaza de loc celula in care ma pozitionez sau daca se selecteaza atunci cind ma misc de la sageti imi coloreaza si restu de celule...la un moment dat nu mai intelegi nimik din grid'ul ala cum te tot plimbi
astea se intimpla cind dau programatic page2.setfocus
daca dau click cu mousul pe page2 nu se mai intimpla
Poti sa postezi form-ul?
trebuie modificat form.init sqlconnect()
si form.pageframe1.page2.click sqlexec()
Nu-i nevoie sa modific nimic, am gasit problema. E in codul de populare a grid-ului. Pe sistemul meu codul asta nu merge. Adica merge, dar face un grid alb.
SQLEXEC
Sa le luam pe rand. Mai intai si mai intai, inainte de a distruge cursorul (cu sqlexec) trebuie sa deconectezi grid-ul. Prima linie trebuie sa fie grid.recordsource = "" si dupa aia orice altceva. In caz contrar, se "albeste". In al doilea rand, grid-ul are pus ca RecordSourceType 1, adica alias. Alias fiind un nume de tabela, cursor, view, whatever, dar NU o instructiune sql. Daca tii musai sa folosesti o instructiune sql ca recordsource, atunci pui RecordSourceType pe 4, da' n-are sens intr-un mediu client server, pentru ca nu poti sa pui SQLEXEC, ci doar SELECT (care va cauta tabele locale). Singurul motiv pentru care linia a doua nu crapa este faptul ca tabelele pot avea spatii in nume, si el trateaza textul ala ca pe un nume de tabela. (Este adevarat ca ar fi trebuit sa crape cu eroarea "Alias 'select * from crs blah blah' is not found". Poate-i un bug in vfp. Nu stiu.)
In al treilea rand, selectia dintr-un cursor in acelasi cursor ... hmm... nu stiu cum sa zic.. mai bine ma abtin.
In al treilea rand, ideea de a pune codul care aduce inregistrari in page.click nu este prea buna. Daca userul se plimba printre pagini tu faci trafic la greu.
In fine, vorba lunga saracia omului. Codul tau trebuie sa arate asa:
Ia incearca si spune-mi daca merge.
La mine merge dar cu problema amintita...si intr-adevar am gresit eu cind am facut form'ul pt tine trebuia sa fie type 4 ..la mine e cu 4..
Sa le luam pe rand. Mai intai si mai intai, inainte de a distruge cursorul (cu sqlexec) trebuie sa deconectezi grid-ul. Prima linie trebuie sa fie grid.recordsource = "" si dupa aia orice altceva. In caz contrar, se "albeste".
am facut si asta ..acesi poveste
ok..pare intr-adevar ciudat dar am ajuns la asta pt ca daca dai numa "select * from crs" iti baga rezultatul in fereastra brow si nu in grid cu toate ca comanda este la recordsource..
citez din vfp help comanda select : " INTO Destination
da asta e drept..trebuia alt nume la cursor....dar merge....
e optiunea mea cu traficul...
Idea e ca tot asa e cu toate modificarile sugerate de tine.
Thx
eventual pun poza cu problema...
No offense da are legatura ...
pt ca problema apare in momentul cind primeste al doilea setfocus page2 indiferent unde este codul de populare a gridului.
in concluzie problema este cind se face al doilea setfocus de la butonul de search
thx again
Zau, nu pricep de ce nu vrei sa faci si tu ca toata lumea, cu alias si "crs" in recordsource. Eu am verificat inainte de a-ti da raspunsul. Am formul functional, daca doresti, pot sa ti-l trimit. Daca nu, nu. Subiectul asta este inchis pentru mine; poate doreste altcineva sa intervina si sa-ti rezolve problema. Atat timp cat pui problema "trebuia alt nume la cursor dar merge..." pai nu merge. Uite-te la tine pe ecran si spune-mi daca merge sau nu. Ei bine, la mine merge.
Omule ..am facut cum ai scris tu si TOT NU MERGE !!!!
uite pozele...
form_1.jpg la primul focus
form_2.jpg la al 2 lea focus
Apelarea page2.click() din buton nu e chiar cea mai buna solutie. Click este event, nu metoda. Cand se executa codul pe care il ai in aceasta metoda, pagina2 nu este inca activata, iar refresh-ul gridului nu se executa.
Pune in butonul de search - in click, sau unde e codul acum :
pageframe.activepage=2pageframe.page2.click()
desi eu as muta codul din page2.click() in page2.grid.UIEnable(), unde sa fie executat doar la lenable=.t.
In ceea ce priveste codul in runtime, daca nu ai bindevent, exista si varianta de a face o clasa, care sa aiba codul necesar, si pe care sa o instantiezi in runtime.
In rest, ia in consideratie tot ce ti-a spus Grig, pentru ca asa este.
THX merge perfect acum cu activepage=2
asta era solutia
ms mult Dan
Si totusi, faptul ca gridul merge asa e pur conjunctural. Cand vei creste complexitatea formului asta, te vei lovi de ce ti-a semnalat Grig.
Mersi din nou foarte mult pentru ajutor...iar formul nu va creste in complexiate va ramine asa.
Si 2. am facut asa cum a zis Grig, dar problema era de altundeva...anyway...
Daca tot suntem la rezolvari cu grid si restu...am o alta intrebare..
Am vazut odata rezolvat dar nu stiu cum...in VFP 5.0 parca, un grid populat din sql server din mai multe tabele la care daca schimbam valorile in grid facea automat update in sql server ..gen cum ar fi o fereastra de browse din dbf....
problema apare ca degeaba setez eu grid pe read-write ca tot nu ma lasa sa modific nimic...si pare si logic,.....nu reusesc sa imi dau seama ei cum au facut acest lucru...
orice idee e binevenita !!
MS din nou
PS: imi pare rau da se pare ca am gresit la ultimul post...
totusi pot introduce valori in grid..
imi pare rau de post gresit...
Ms