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  Client/Server  Echivalent ROWS...
 Echivalent ROWS /LIMIT in SQL Server 2005
 
 3/20/2008 11:48:16 AM
User is offlineDorin Vasilescu
1366 posts
1st




Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Salut
Am facut un prototip pentru o clasa de genul "cursor virtual".
Ce face? Aduce seturi de date limitate de pe server, in acelasi timp afisand un scrollbar care reflecta numarul total de inregistrari care ar rezulta din interogarea respectiva. Utilizatorul poate face scroll si se aduc de pe server inregistrarile in functie de .TopIndex de la "scrollbar" (care e de fapt un listbox  ingust de tot )
Ceva de genul Yahoo Mail, un FetchAsNeeded care nu tine conexiunea ocupata si care nu are nevoie de Asyncronous = .T.

Pe Firebird merge bine, deoarece are implementata clauza ROWS ... TO ...
Ca sa aduc inregistrarile fac doar atat:
cmd = comanda_sql_curenta + " ROWS " + transform( list.TopIndex ) + ' TO ' + transform( list.TopIndex + 20 )
si execut comanda respectiva + inlocuirea datelor din cursor cu cele aduse
Am incercat pe SQL Server 2005 si nu stie de comanda asta.
Cum s-ar putea face pe SQL Server 2005, deoarece e o facilitate interesanta de adaugat  pentru programe




 3/20/2008 12:06:23 PM
User is offlineaflorin
840 posts
1st


Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Vad in documentatia de SQL Server asta:

TOP expression [ PERCENT ] [ WITH TIES ]
Indicates that only a specified first set or percent of rows will be returned from the query result set. expression can be either a number or a percent of the rows.

Desi nu am incercat-o, pare un punct de pornire.

Florin Aparaschivei - Iasi
 3/20/2008 12:51:27 PM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Hmmm, nu pare posibil sa iasa ceva fara sa intervin in comanda SQL si sa o modific.

Ca sa se inteleaga mai bine ...

Sa zicem ca am un CursorAdapter cu comanda SQL : SelectCmd = "select * from clienti order by numeclient"

Se va executa count pe aceeasi conexiune:  CountCmd = [select count(*) from (] + SelectCmd + [) ]
Se va dimensiona scrollbarul corespunzator numarului total de inregistrari
Se face BindEvent pe TopIndex la acel scrollbar ( listbox la care se vede doar partea de scroll de fapt )

Cand se modifica TopIndex la list se executa comanda Cmd = SelectCmd + [ ROWS ?list.TopIndex TO ?(list.TopIndex + cate vreau) ]
Se goleste cursorul si se adauga datele noi venite de pe server
Din punct de vedere al interfetei, pare acces normal, ca si cum ar fi toate venite de pe server si te plimbi pe ele, de fapt sunt doar 20-30. Cred ca asa face fi VFP cu accesul local pe tabele.

Probabil ca la MySQL merge cu LIMIT la fel de bine, fara sa intervin in comanda
originala


 3/20/2008 1:19:53 PM
User is offlineaflorin
840 posts
1st


Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Gata, acum am inteles.

Nu prea cred sa existe asa ceva prin SQL Server.

Ca o posibila solutie, poti incerca sa folosesti indexul cheie primara pentru a vedea cum imparti interogarea cu clauza BETWEEN. Dar cred ca se pierde caracterul de generalitate.

Florin Aparaschivei - Iasi
 3/20/2008 1:33:32 PM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
O sa mai caut si eu pe net, can o sa dispun de mai mult timp.
Multumesc
 3/21/2008 12:00:11 AM
User is offlineadrian
48 posts
www.infostarpitesti.ro


Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Salut Dorin, cea ce ai tu nevoie suna cam asa pentru MSSQL:
    Select top 10 from numebaza
 3/21/2008 12:01:21 AM
User is offlineadrian
48 posts
www.infostarpitesti.ro


Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
select top 10 from numetabela (scuze)
 3/21/2008 10:08:44 AM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Salut
Nu vreau doar primele 10, vreau de la 1000 la 1020 de exemplu.


 3/21/2008 10:14:04 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
S-ar putea utiliza ceva de forma urmatoare:

declare @start int, @delta int
set @start=10
set @delta=5

select * from
(select name, column_id,
     row_number() over (order by column_id) as rownum
    from sys.all_columns)  aa
    where rownum between @start and @start+@delta





Daniel Buduru
 3/21/2008 11:24:53 AM
User is offlinegabi123
106 posts
5th


Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (Romania)

n-am citit prea atent , deh timpul , sa inteleg ca doresti o aducere paginata a datelor ?

daca da , pentru 2000 : http://weblogs.sqlteam.com/jeffs/archive/2004/03/22/1085.aspx

sau http://www.sqlmag.com/Files/09/40505/Listing_04.txt

era una traznet pentru 2005 , dar n-o gasesc , daca te intereseaza , mai caut

 3/21/2008 1:54:08 PM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
 Daniel Buduru wrote
S-ar putea utiliza ceva de forma urmatoare:

declare @start int, @delta int
set @start=10
set @delta=5

select * from
(select name, column_id,
     row_number() over (order by column_id) as rownum
    from sys.all_columns)  aa
    where rownum between @start and @start+@delta




Da, aste e!
Multumesc

Merge bine, chiar si prin 250 000 de inregistrari, parca sunt toate local


 3/21/2008 8:07:16 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Cu placere

Daniel Buduru
 5/19/2008 11:24:48 PM
User is offlineVladPop
250 posts
4th




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
In SQL 2005 poti face asa ceva:

WITH q AS (
    SELECT
        ROW_NUMBER() OVER (ORDER BY  p.Nume ) AS rownr,
       p.Nume
    FROM Produse p
)q SELECT * FROM q WHERE q.rownr>0 AND q.rownr<=20



Vlad Pop.
 5/19/2008 11:26:22 PM
User is offlineVladPop
250 posts
4th




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Ah... Scuze, nu stiu cum de nu am observat ca mai sus ai primit acelasi raspuns :) Credeam ca spune altceva.

Vlad Pop.
 5/24/2008 5:02:29 PM
User is offlineGhiorghiu Bogdan
928 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Stie cineva cum s-ar putea obtine acelasi rezultat si pe PostgreSql?

Ghiorghiu Bogdan >>> Dacă tot te apuci să faci o treabă, fă-o bine de la inceput!
 6/4/2009 6:47:57 PM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
 Dorin Vasilescu wrote
Hmmm, nu pare posibil sa iasa ceva fara sa intervin in comanda SQL si sa o modific.

Ca sa se inteleaga mai bine ...

Sa zicem ca am un CursorAdapter cu comanda SQL : SelectCmd = "select * from clienti order by numeclient"

Se va executa count pe aceeasi conexiune:  CountCmd = [select count(*) from (] + SelectCmd + [) ]
Se va dimensiona scrollbarul corespunzator numarului total de inregistrari
Se face BindEvent pe TopIndex la acel scrollbar ( listbox la care se vede doar partea de scroll de fapt )

Cand se modifica TopIndex la list se executa comanda Cmd = SelectCmd + [ ROWS ?list.TopIndex TO ?(list.TopIndex + cate vreau) ]
Se goleste cursorul si se adauga datele noi venite de pe server
Din punct de vedere al interfetei, pare acces normal, ca si cum ar fi toate venite de pe server si te plimbi pe ele, de fapt sunt doar 20-30. Cred ca asa face fi VFP cu accesul local pe tabele.

Probabil ca la MySQL merge cu LIMIT la fel de bine, fara sa intervin in comanda
originala




Cum faci 'Se va dimensiona scrollbarul corespunzator numarului total de inregistrari' ?

Poti sa ne arati te rog un exemplu cu clasa ta realizata pentru Firebird ? multumesc
 6/5/2009 11:47:46 AM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Exemplul pentru Firebird e in fisierul de mai jos
http://dorinvas.googlepages.com/test_virtualgrid.zip

Desfaci ce e in zip, configurezi o conexiune ODBC  cu numele TEST in Control Panel care sa deschida baza de date test.fdb
ulterior executi setconn.prg si dupa aia formul test.scx

acolo e cam tot, e foarte simplu de implementat
sunt catre 4000 de inregistrari. dar am testat si cu mai multe, "gafaie" putin cam de la 500k in sus.



 6/8/2009 11:28:49 AM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Multumesc pentru exemplu . Meriti o bere :) !
 6/24/2009 8:54:56 PM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Solutia ta parca zboara pe o tabela de aproape 100.000 de inregistrari in Firebird .
Poti te rog sa ma luminezi si in problema cautarii : pe form am un textbox pe care-l folosesc ca sa caut prin aceasta tabela si vreau ca cautarea sa se realizeze progresiv pe masura ce tastez .
Multumesc !
PS . Daca ajungi prin Constanta ar fi o placere pentru mine sa-ti fac cinste cu cateva beri (sau orice alt serviciu) .
 6/25/2009 11:16:34 AM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Salut
Pune un textbox pe form si codul asta in InteractiveChange

m.cFindStr = Trim(this.Text)
SQLExec( _screen.oapp.nconhnd ,[select Count(cod_fiscal) as topindex  from furniz where denumire < ?m.cFindStr],'record')
thisform.list1.TopIndex = record.topindex + 1

Mai este un SetFocus() pr grid in  form.refreshCursorData() la care trebuie comentata linia
 6/25/2009 12:02:19 PM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Solutia propusa merge si este o varianta de cautare .
Eu mi-as dori ceva mai complex , de genul sa-mi arate toate sirurile care contin sirul introdus sau
pe form sa mai adaug inca un textbox(txtcui) in care utilizatorul sa-mi introduca cateva cifre din codul fiscal iar in final eu sa-i arat in cadrul gridului toti furnizorii care al caror cod fiscal contine txtcui.value
si denumirea lor contine txtdenumire.value . Ce vreau eu presupune modificarea lui "selectcmd" dupa parerea mea .

O alta problemuta : Exemplul tau l-am adaptat la ce am eu si cateodata ,din cand in cand, in momentul in care deschid forma imi da eroarea :
.....control source: alias '.....' is not found
ii dau cancel , pornesc din nou si nu mai obtin eroarea .


 6/25/2009 6:33:49 PM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A) Modified By costin_mentor  on 8/27/2009 12:05:59 PM)
Scenariu : o tabela cu peste 100.000 de inregistrari (un nomenclator de produse) , un form cu un grid si niste texboxuri deasupra gridului.
Vreau sa caut ceva in genul : toate produsele care contin in denumire CEN si au in codul de bare secventa de cifre 123 .

Ce modalitati(dupa mai multe criterii : denumire, grupa, clasa,...) de cautare recomandati si cat mai rapida .

Dupa mine sunt 2 variante :
1. se aduce toata tabela pe local si atunci se poate cauta/filtra foarte usor .
2. Completez criteriile de cautare(textboxu-urile) si langa sa am un buton "Cauta" care sa-mi recreeze cursorul care este recordsource pentru grid si sa aduc inregistrarile prin metoda excelenta sugerata de Dorin .
 8/27/2009 12:06:29 PM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Vad ca nimeni nu e dispus sa-si impartaseasca experienta .
 9/1/2009 9:55:33 AM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (N/A)
Legat de metoda propusa de Dorin , din cand in cand (cand lansez formul) intampin eroarea :
"error loanding file - record number 12. grdcasebanci . ControlSource : alias 'ccasebanci' is not found. "

Daca dau un "bulid" la proiect totul se rezolva. Poate sa-mi explice si mie cineva in ce context apare aceasta eroare ? Eu banui ca nu a reusit sa-si creeze cursorul (care este creat in data environment) dar nu-i vad cauza si explicatia .
Multumesc
 12/5/2009 8:31:10 PM
User is offlinecostin_mentor
492 posts
www.accessoft.ro
2nd




Re: Echivalent ROWS /LIMIT in SQL Server 2005
 (Romania) Modified By costin_mentor  on 12/5/2009 9:57:24 PM)
 Dorin Vasilescu wrote
Exemplul pentru Firebird e in fisierul de mai jos
http://dorinvas.googlepages.com/test_virtualgrid.zip

Desfaci ce e in zip, configurezi o conexiune ODBC  cu numele TEST in Control Panel care sa deschida baza de date test.fdb
ulterior executi setconn.prg si dupa aia formul test.scx

acolo e cam tot, e foarte simplu de implementat
sunt catre 4000 de inregistrari. dar am testat si cu mai multe, "gafaie" putin cam de la 500k in sus.





Dorin , poti te rog sa ma luminezi in urmatoarea problema :

Am creat o forma dupa modelul propus de tine si cursoarele se deschid in DataEnvironment . Am definit o proprietate la _Screen exact ca in exemplul tau :
_screen.oapp.nconhnd=...

Totul functioneaza bine pentru o singura baza de date Firebird. Problema apare cand, in cadrul programului(prin intermediul unui buton) incerc sa aleg o alta baza de date Firebird . In momentul cand ma conectez la alta baza de date, reinitializez si
_screen.oapp.nconhnd ( pentru ca pe el se bazeaza DataEnvironmentul formei) , dar totusi eu vad in continuare datele din prima baza de date Firebird (bazele de date au structura identica). De ce ?
Observ ca daca modific la unul din cursoarele definite in DataEnvironmentul formei si bifez la "Use DataEnvironment data source" (in loc sa las pe optiunea "use existing connection handle") problema este rezolvata , dar nu-mi explic de ce.
Poate sa ma lumineze cineva ?
Multumesc


Edit: M-am luminat, problema era ca nu dadeam niciodata
sqldisconnect(_screen.oapp.nconhnd)
inainte de conectarea la noua baza de date .
  Visual FoxPro  Client/Server  Echivalent ROWS...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement