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  INSERT INTO TAB...
 INSERT INTO TABELA SQL
 
 2/23/2009 10:36:51 AM
User is offlinelmax25
57 posts


INSERT INTO TABELA SQL
 (N/A)

Salut.

Am o tabela locala 'TABELA LOCALA' cu mai multe cimpuri si inregistrari.Pe SQL Server am o tabela cu acelasi nume si structura.

Cum pot printr-o comanda SQL sa adaug toate date din tabela locala in cea de pe server ? Am nevoie de ceva similar cu APPEND FROM.

 

 2/23/2009 10:55:57 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: INSERT INTO TABELA SQL
 (Romania)
Creezi un remote view sau cursoradapter cu sursa tabela de pe server. View-ul sau cursorul actualizabile (send updates = .t.), cu comanda select de forma
SELECT * FROM tabela_server WHERE 1=2
Clauza where 1=2 va genera un cursor fara inregistrari.
Se seteaza optimistic table buffering pentru cursor.
Se da comanda APPEND FROM tabela_locala
Apoi TABLEUPDATE(1,.T.,'alias_cursor')



Daniel Buduru
 2/23/2009 11:05:39 AM
User is offlinelmax25
57 posts


Re: INSERT INTO TABELA SQL
 (N/A)

Nu intentionez deocamdata sa folosesc REMOTE VIEW.

As vrea ceva de genul : SQLEXEC(nhandle,"insert into 'tabela SQL' * from 'tabela locala'")

Sau sa generez un cursor local cu SELECT dar nu stiu sa-l pun in tabela de pe server.

Un exemplu sau sintaxa comenzii se poate ?

Multumesc.

 2/23/2009 11:28:55 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: INSERT INTO TABELA SQL
 (N/A)
 lmax25 wrote

As vrea ceva de genul : SQLEXEC(nhandle,"insert into 'tabela SQL' * from 'tabela locala'")

Sau sa generez un cursor local cu SELECT dar nu stiu sa-l pun in tabela de pe server.



Nu se poate asa. Cursorul sau tabela locala si cea de pe server sunt in medii total separate. Tot ce intra in comanda SQLEXEC trebuie sa fie vizibil pentru server.
Varianta cu cursor actualizabil, fie view, fie cursoradapter, e cea mai directa, si e simplu de realizat folosind builderele respective din vfp.
O alta posibilitate este sa faci un linked server in server sql, sa te conectezi la baza de date vfp, apoi poti face insertul direct pe server.

Tot ce poti face cu sqlexec este sa inserezi linie cu linie, specificand fiecare camp:

SELECT tabela_locala
SCAN all
    SCATTER MEMO MEMVAR
    IF SQLEXEC(hh,'INSERT INTO tabela_server (camp1, camp2) values (?camp1, ?camp2)')<>1
        AERROR(ae)
        MESSAGEBOX(ae[2])
    ENDIF   
ENDSCAN

Celalalte variante sunt si mai rapide, si mai flexibile, desi poate sa-ti fie mai greu prima data.

Daniel Buduru
 2/23/2009 1:02:21 PM
User is offlinelmax25
57 posts


Re: INSERT INTO TABELA SQL
 (N/A)

As dori un ceva exemple pentru CursorAdapter si REMOTE VIEW daca se poate... Sau link unde le gasesc

 2/23/2009 1:33:34 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: INSERT INTO TABELA SQL
 (Romania)
Un articol despre cursoradapter gasesti aici:
http://www.code-magazine.com/Article.aspx?quickid=0301062

Pentru remote view:
http://books.google.ro/books?id=RUlnXQYXADgC&pg=PA126&lpg=PA126&dq=vfp+remote+view&source=bl&ots=b2J1J8pYv_&sig=-knOZRgzZB0fsuttwS-1sf3hsOU&hl=en&ei=X5SiSaUpj43-Bv2pkNYL&sa=X&oi=book_result&resnum=18&ct=result
Ce te intereseaza incepe in pag 126

De retinut ca articolul despre CA se refera la VFP8, VFP9 a adus ceva modificari.
Cel despre remote view se refera la VFP6.

Pentru a putea utiliza CA builderul: creezi o clasa bazata pe cursoradapter intr-o biblioteca. Click dreapta pe obiect deschide menu-ul in care poti selecta builderul.
Odata definita clasa, se poate utiliza fie in dataenvironment, fie instantiata ca obiect:
oca=newobject('myCA','myCALibrary')
oca.datasource=nconnectionhandle
oca.datasourcetype='ODBC'
oca.CursorFill
select (oca.alias)
append from tabela_locala
tableupdate(1,.t.)



Daniel Buduru
 2/23/2009 3:33:41 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: INSERT INTO TABELA SQL
 (Romania)
Daca ai portat o intreaga baza de date vfp pe serverul sql si doresti sa importi continutul tabelelor din vfp, e mai convenabil sa legi baza de date vfp la serverul sql ca linked server.
Daca te intereseaza solutia asta, specifica ce versiune de sql server folosesti si daca tabelele vfp fac parte dintr-o database sau sunt independente.

Daniel Buduru
 2/23/2009 4:02:11 PM
User is offlinelmax25
57 posts


Re: INSERT INTO TABELA SQL
 (N/A)

Acum folosesc SQL Server express 2005 si tabelele mele fac parte dintr-o database(.DBC).

Te rog spune-mi cum pot lega .DBC la SQL Server.

Domnule Daniel Buduru va multumesc pentru raspunsurile prompte pe care mi le-ati dat.

 2/23/2009 4:25:58 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: INSERT INTO TABELA SQL
 (Romania)
VFPDATA e numele dat linked server-ului.
Z:\DBCFOLDER\VFPDATA.DBC e calea catre dbc, unde z:\ e o unitatea de retea mapata; poate fi si locala.
Un script (putin modificat) generat de SQL Server Express 2008 pentru un linked server :


/****** Object:  LinkedServer [VFPDATA]    Script Date: 02/23/2009 16:23:53 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'VFPDATA', @srvproduct=N'VFP', @provider=N'VFPOLEDB', @datasrc=N'Z:\DBCFOLDER\VFPDATA.DBC', @provstr=N'VFPOLEDB.1'
 /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'VFPDATA',@useself=N'False',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO

EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'VFPDATA', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO


-- Pentru a referi o tabela din acest server sintaxa este [linked_server_name]...[table_name]
-- Ex:

SELECT * FROM [vfpdata]...[tabela_locala]

INSERT INTO tabela_server (camp1, camp2) SELECT camp1, camp2 FROM [VFPDATA]...[tabela_locala]




Daniel Buduru
 2/26/2009 9:10:39 PM
User is offlinelmax25
57 posts


Re: INSERT INTO TABELA SQL
 (N/A)

Urmind exemplul de la acest link am facut tot ce scria acolo pina la Step 3.

Am incercat sa apelez codul de mai jos in mai multe form-uri,dar lucreaza bine doar in primul form.Daca incerc sa-l execut din alt form si sa-i schimb SELECTCMD primesc urmatoarea eroare : Alias name is already in use.

Am incercat sa sterg manual aliasul dar degeaba.
Ce trebuie sa fac pentru a folosi acelasi alias ori de cite ori este nevoie ?
Multumesc.

 

PUBLIC obj_ca1
obj_ca1= CREATEOBJECT('ca_1')
obj_ca1.alias='temp_cursor1'
obj_ca1.SelectCmd="SELECT * FROM SQL_TABLE1"
obj_ca1.lNoDataOnLoad = .F.
 
IF obj_c1.CURSORFILL(.F.,.F.)
   BROWSE
ELSE
   Aerror(laError)
   ?laError[1,2]
ENDIF
 2/26/2009 10:15:50 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: INSERT INTO TABELA SQL
 (N/A)
Toate formurile definite cu datasession=0 (default) se deschid in sesiunea 0, deci, daca in fiecare form instantiezi acelasi cursoradapter, cu acelasi alias, va veni in conflict cu cele definite anterior. Alias-ul cursorului trebuie sa fie unic intr-o sesiune de date.
Defineste formul cu datasession=2 (private) si nu vei mai avea aceasta problema.
Pe de alta parte, nu e o practica buna sa te bazezi pe variabile publice atata vreme cat nu esti restrictionat la programare procedurala.
In loc de PUBLIC obj_ca1, e mult mai comod sa il definesti ca pe o proprietate a formului sau a unui obiect continut in el. Daca folosesti variabile publice, trebuie sa dai alt nume CA-ului in fiecare form ...

THISFORM.NewObject('ca1','cursoradapter')
Local oca
oca=thisform.ca1
oca.alias='temp_cursor'
...

Ai reusit sa linkezi baza de date vfp la serverul SQL?



Daniel Buduru
 2/26/2009 10:40:30 PM
User is offlinelmax25
57 posts


Re: INSERT INTO TABELA SQL
 (N/A)

Spune-mi te rog:

Este vreo problema daca de fiecare data la apelarea unui CursorAdapter ii schimb numele aliasului cu unul generat aleator ? (nume1='nume'+rand(500)+crc32(seconds()   sau  nume='nume1'+crc32(generez un GUID))

Cit timp ramine pe disk un cursor ?

Nu am reusit sa link-ez baza de date vfp la serverul SQL pentru ca m-am ocupat de Remote View si CursorAdapter.Personal imi place mai mult CursorAdapter.

Multumesc !

 2/26/2009 10:55:40 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: INSERT INTO TABELA SQL
 (N/A)
Poti sa dai ce alias vrei unui cursor, doar ca, daca ii generezi numele aleator, nu prea vad cum te vei referi la el in aplicatie.
Lucreaza cu form cu private datasession, da nume sugestive cursoarelor, unice pentru fiecare form, si e ok.
Nu da nume lungi, va trebui sa te referi la campuri cu aliasul cursorului, si va fi tare incomod cu nume lungi.

CursorAdapter este un wrapper pentru View, respectiv un obiect care expune, sub forma de proprietati si metode, setarile necesare pentru cursorul view-ului si, in parte, pentru conexiune.

Un cursor exista in memorie, pe disc este creat doar ca memorie virtuala. In momentul in care cursorul este inchis cu USE in zona lui, sau este eliberat CA-ul cu care a fost creat, sau se inchide datasession in care a fost creat, memoria ocupata de el este eliberata. Mai concret, toate cursoarele dispar cand se inchide aplicatia in care au fost create.



Daniel Buduru
 2/26/2009 11:17:05 PM
User is offlinelmax25
57 posts


Re: INSERT INTO TABELA SQL
 (N/A)

Deocamdata merge cu private data session. Sint sigur ca daca as folosi un formset cu citeva form-uri  care sa foloseasca aceleasi tabele as avea probleme.

Cred ca voi incerca sa dau nume diferite pentru fiecare alias si pentru a ma referi la cursor cred ca merge cu : ca_obj.alias  .

Multumesc pentru ajutor !

 

 2/26/2009 11:41:33 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: INSERT INTO TABELA SQL
 (N/A)
Nu folosi formset! A fost introdus in VFP3 pentru a prelua ceva din FoxPro 2. Nu este recomandabil sa il utilizezi acum.
In vfp exista foarte multe comenzi care dateaza de pe vremea lui DBASE II. Au ramas in vfp pentru ca VFP este, la ora asta, singurul mediu de programare compatibil in jos cu toate versiunile anterioare. Dar a folosi astazi aceste comenzi este la fel de util cu a invata sa mani caii pentru a conduce masina, doar pentru ca, inainte de masina, se foloseau trasuri trase de cai ...
VFP e la ultima versiune, va mai trai o vreme, dupa care se va renunta la el. In locul lui se folosesc deja baze de date sql si interfete realizate in .net sau altele, dar toate limbaje OOP, si nu procedurale. Ai inceput bine cu serverul sql, continua cu programarea orientata obiect pe partea de client, si iti va fi usor sa treci la alt mediu de programare.


Daniel Buduru
  Visual FoxPro  Client/Server  INSERT INTO TAB...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement