1

Konu: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Arkadaslar,
scan...endscan arasi bir xml dosyadan xmltocursor(m.xmlfile,512) ile aldigim kayitlari SQLe gondermem
gerekiyor ve asagidaki gibi bir komutu SQLe gonderiyorum hata aliyorum cunki komut icindeki numeric alanlar
text..entext icinde orn. cursor/tableda 0.00 iken _cliptext ile olusan koda baktigimda 0,00 seklinde
olusuyor dolayisiylada field sayilari uyusmadigi icin SQL hata veriyor , ne onerirsiniz? text..endtext kullanmadanmi yapsam?

Visual Fox Pro
TEXT TO m.lcSQLInsert TEXTMERGE NOSHOW PRETEXT 15 

    INSERT INTO <<m.LcDatabase>>..intsales
    (
    firmid,tarih,depokodu,ckodu,eskibakiye,skodu,miktar,fiyat,tahsilat,bakiye,ozelkod,aciklama,cadi,sadi,lat,lon,myguid
    )
    values
    (
    '<<CrsBackupRecords.firmid>>',
    '<<Substr(Dtos(CrsBackupRecords.tarih),1,4) + "-" + Substr(Dtos(CrsBackupRecords.tarih),5,2) + "-" + Substr(Dtos(CrsBackupRecords.tarih),7,2)>>',
    '<<CrsBackupRecords.depokodu>>','<<CrsBackupRecords.ckodu>>',
    <<CrsBackupRecords.eskibakiye>>,
    '<<CrsBackupRecords.skodu>>',
    <<CrsBackupRecords.miktar>>,
    <<CrsBackupRecords.fiyat>>,
    <<CrsBackupRecords.tahsilat>>,
    <<CrsBackupRecords.bakiye>>,
    '<<CrsBackupRecords.ozelkod>>','<<CrsBackupRecords.aciklama>>',
    '<<CrsBackupRecords.cadi>>','<<CrsBackupRecords.sadi>>',
    <<CrsBackupRecords.lat>>,
    <<CrsBackupRecords.lon>>,
    '<<CrsBackupRecords.myguid>>'
    )
ENDTEXT

2 Son düzenleyen, ugurlu2001 (07.03.2015 17:34:18)

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Selam Soykan;

Sadece sesli düşünüyorum:

XML dosyası oluşturmadan önce şunları yapsan :
* Default değerleri sakla
Set Sysformat OFF
Set Point to "."
    *** XML dosyasını oluştur
* Set SysFormat ve Set Point değerlerini default değerlerine geri yükle!

Hatta sadece Set Point to ile de işini görebilirsin sanki !

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Ugur,
Xml olusturmadan once cast() ile olmasi gereken yapida xml in olusmasini sagliiyorum ardindan xmltocursor()  ile cursor e aliyorum ve cursor datayi text..exdtext arasi gonderirken olay bozuluyor sad

4

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Merhaba Soykan, benzer bir acaiplik bana SP komutu sırasında olmuştu.
2 uygulama ile çözdüm, ancak hangisin ilaç olduğunu bilmiyorum. Denersen olur diye düşünüyorum.

A- komutu N'<<CrsBackupRecords.fiyat>>' diye ( N'123.45' ) prefixi ile yolla.
Her ne kadar karakter için kullanılsa da temelde SQL tarafına "karakter değil uni-code" bilgisi veriyor.

B- <<STR(CrsBackupRecords.fiyat,8,2)>>

sevgiler - a.

VFP9 SP2

5 Son düzenleyen, msayin (08.03.2015 12:30:09)

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Set Point "." kullanımı text , endtext öncesi olmalı veya alternatif

<<Strtran(Transform(CrsBackupRecords.fiyat),",",".")>>

6

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Çözümü gene kendim buldum smile

set point kullanimi burada önemli! ayrica CAST() da <<>> disinda olursa sorun olmuyor

orn : CAST(<<CrsBackupRecords.bakiye>> AS Numeric(16,2)),


Visual Fox Pro
m.lcPoint = SET("Point") 

SET POINT TO "."
 
 
SELECT 'CrsBackupRecords'
 
Scan
 
    TEXT TO m.lcSQLInsert TEXTMERGE NOSHOW PRETEXT 15
    INSERT INTO <<m.LcDatabase>>..intsales
    (
    [firmid],[tarih],[depokodu],[ckodu],[eskibakiye],[skodu],[miktar],[fiyat],[tahsilat],[bakiye],[ozelkod],[aciklama],[cadi],[sadi],[lat],[lon],[myguid]
    )
    values
    (
    '<<CrsBackupRecords.firmid>>',
    '<<CHRTRAN(TTOC(CrsBackupRecords.tarih,3),[T],SPACE(1))>>',
    '<<CrsBackupRecords.depokodu>>',
    '<<CrsBackupRecords.ckodu>>',
    CAST(<<CrsBackupRecords.eskibakiye>> AS Numeric(16,2)),
    '<<CrsBackupRecords.skodu>>',
    CAST(<<CrsBackupRecords.miktar>> AS Numeric(16,2)),
    CAST(<<CrsBackupRecords.fiyat>> AS Numeric(12,6)),
    CAST(<<CrsBackupRecords.tahsilat>> AS Numeric(16,2)),
    CAST(<<CrsBackupRecords.bakiye>> AS Numeric(16,2)),
    '<<CrsBackupRecords.ozelkod>>',
    '<<CrsBackupRecords.aciklama>>',
    '<<CrsBackupRecords.cadi>>',
    '<<CrsBackupRecords.sadi>>',
    CAST(<<CrsBackupRecords.lat>> AS Numeric(9,6)),
    CAST(<<CrsBackupRecords.lon>> AS Numeric(9,6)),
    '<<CrsBackupRecords.myguid>>'
    )
    ENDTEXT
 
    _cliptext = m.lcSQLInsert
 
    =SQLTableInsert(m.lcSQLConnString,m.lcSQLInsert)
 
Endscan
 
SET POINT TO (m.lcPoint)

öneriler icin teşekkürler @ali , @msayin

7

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Ben bosuna cevap yazmisim smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

8

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

ugurlu2001 yazdı:

Ben bosuna cevap yazmisim smile

yok yazmamissin ilk etapta ben onu dikkate almadim herhalde , .prg uzerinden denerken _cliptext sonucunda kod calisip insert islemi gerceklesip exede gerceklesmeyince _cliptext te yine "," oldugunu gorunce olayin set pointlik oldugunu farkettim ancak CAST() inida dogru kullanmak gerek SSMS nin urettigi insert komutlarini inceleyerek onu istedigi gibi SQL cumlesinin olusmasini sagladim , tekrar tesekkur smile

9

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

1) ASLA ve ASLA boyle hardcoded yapma, parametre kullan.

Visual Fox Pro
TEXT TO m.lcSQLInsert TEXTMERGE NOSHOW PRETEXT 15 

INSERT INTO <<m.LcDatabase>>..intsales
(
  firmid,tarih,depokodu,
  ckodu,eskibakiye,skodu,
  miktar,fiyat,tahsilat,
  bakiye,ozelkod,aciklama,
  cadi,sadi,
  lat,lon,myguid
)
values
(
  ?CrsBackupRecords.firmid, ?CrsBackupRecords.tarih, ?CrsBackupRecords.depokodu,
  ?CrsBackupRecords.ckodu, ?CrsBackupRecords.eskibakiye, ?CrsBackupRecords.skodu,
  ?CrsBackupRecords.miktar, ?CrsBackupRecords.fiyat, ?CrsBackupRecords.tahsilat,
  ?CrsBackupRecords.bakiye, ?CrsBackupRecords.ozelkod, ?CrsBackupRecords.aciklama,
  ?CrsBackupRecords.cadi, ?CrsBackupRecords.sadi,
  ?CrsBackupRecords.lat, ?CrsBackupRecords.lon, ?CrsBackupRecords.myguid
)
EndText
 
Local handle
handle = SQLStringConnect('Driver={SQL Server Native Client 11.0};Server=.\SQLExpress;Database=MyDb;Trusted_Connection=yes')
SQLPrepare(m.handle, m.lcSQLInsert)
 
Select crsBackupRecords
Scan
  SQLExec(m.handle)
EndScan
 
SQLDisconnect(0)

2) Dogrudan XML'in kendisini SQL'e gonderebilirsin.

Visual Fox Pro
Local lcSQL, lcXML, lcNodeName, lnHandle

 
TEXT to lcSQL textmerge noshow
DECLARE @hDoc int
exec sp_xml_preparedocument @hDoc OUTPUT, ?m.lcXML
 
Insert into <<m.LcDatabase>>..intsales
  (
    firmid int,tarih datetime,depokodu,ckodu,eskibakiye,skodu,
    miktar,fiyat,tahsilat,bakiye,ozelkod,aciklama,cadi,sadi,lat,lon,myguid
   )
Select firmid int,tarih datetime,depokodu,ckodu,eskibakiye,skodu,
       miktar,fiyat,tahsilat,bakiye,ozelkod,aciklama,cadi,sadi,lat,lon,myguid
FROM OPENXML(@hDoc, ?m.lcNodename, 1)
WITH (
   firmid varchar(50), tarih datetime,  depokodu varchar(50),
   ckodu varchar(50), eskibakiye Numeric(16,2), skodu varchar(50),
   miktar Numeric(16,2), fiyat Numeric(12,6), tahsilat Numeric(16,2),
   bakiye Numeric(16,2), ozelkod varchar(50), aciklama varchar(4000),
   cadi varchar(50), sadi varchar(50),
   lat Numeric(9,6), lon Numeric(9,6), myguid varchar(50)
)
 
EXEC sp_xml_removedocument @hDoc
ENDTEXT
 
lnHandle = Sqlstringconnect('driver={SQL Server Native Client 10.0};server=.\SQLExpress;Trusted_Connection=yes;')
 
lcNodeName = '/VFPData/backuprecords' && VFP default naming in XML
lcXML = FileToStr(m.xmlfile)
 
SQLExec(m.lnHandle, m.lcSQL)
 
SQLDisconnect(0)

3) Tabii en kolay ve hizlisi sbchelper ile SQL bulk copy smile

10

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Soykan,
Senin yazdigin cast'li yontem hataya acik, benden uyarmasi smile Ozellikle karakter alanlarinda tirnak isareti varsa en basit gocme nedeni.

11

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

cetinbasoz yazdı:

1) ASLA ve ASLA boyle hardcoded yapma, parametre kullan.

Visual Fox Pro
TEXT TO m.lcSQLInsert TEXTMERGE NOSHOW PRETEXT 15 

INSERT INTO <<m.LcDatabase>>..intsales
(
  firmid,tarih,depokodu,
  ckodu,eskibakiye,skodu,
  miktar,fiyat,tahsilat,
  bakiye,ozelkod,aciklama,
  cadi,sadi,
  lat,lon,myguid
)
values
(
  ?CrsBackupRecords.firmid, ?CrsBackupRecords.tarih, ?CrsBackupRecords.depokodu,
  ?CrsBackupRecords.ckodu, ?CrsBackupRecords.eskibakiye, ?CrsBackupRecords.skodu,
  ?CrsBackupRecords.miktar, ?CrsBackupRecords.fiyat, ?CrsBackupRecords.tahsilat,
  ?CrsBackupRecords.bakiye, ?CrsBackupRecords.ozelkod, ?CrsBackupRecords.aciklama,
  ?CrsBackupRecords.cadi, ?CrsBackupRecords.sadi,
  ?CrsBackupRecords.lat, ?CrsBackupRecords.lon, ?CrsBackupRecords.myguid
)
EndText
 
Local handle
handle = SQLStringConnect('Driver={SQL Server Native Client 11.0};Server=.\SQLExpress;Database=MyDb;Trusted_Connection=yes')
SQLPrepare(m.handle, m.lcSQLInsert)
 
Select crsBackupRecords
Scan
  SQLExec(m.handle)
EndScan
 
SQLDisconnect(0)

2) Dogrudan XML'in kendisini SQL'e gonderebilirsin.

Visual Fox Pro
Local lcSQL, lcXML, lcNodeName, lnHandle

 
TEXT to lcSQL textmerge noshow
DECLARE @hDoc int
exec sp_xml_preparedocument @hDoc OUTPUT, ?m.lcXML
 
Insert into <<m.LcDatabase>>..intsales
  (
    firmid int,tarih datetime,depokodu,ckodu,eskibakiye,skodu,
    miktar,fiyat,tahsilat,bakiye,ozelkod,aciklama,cadi,sadi,lat,lon,myguid
   )
Select firmid int,tarih datetime,depokodu,ckodu,eskibakiye,skodu,
       miktar,fiyat,tahsilat,bakiye,ozelkod,aciklama,cadi,sadi,lat,lon,myguid
FROM OPENXML(@hDoc, ?m.lcNodename, 1)
WITH (
   firmid varchar(50), tarih datetime,  depokodu varchar(50),
   ckodu varchar(50), eskibakiye Numeric(16,2), skodu varchar(50),
   miktar Numeric(16,2), fiyat Numeric(12,6), tahsilat Numeric(16,2),
   bakiye Numeric(16,2), ozelkod varchar(50), aciklama varchar(4000),
   cadi varchar(50), sadi varchar(50),
   lat Numeric(9,6), lon Numeric(9,6), myguid varchar(50)
)
 
EXEC sp_xml_removedocument @hDoc
ENDTEXT
 
lnHandle = Sqlstringconnect('driver={SQL Server Native Client 10.0};server=.\SQLExpress;Trusted_Connection=yes;')
 
lcNodeName = '/VFPData/backuprecords' && VFP default naming in XML
lcXML = FileToStr(m.xmlfile)
 
SQLExec(m.lnHandle, m.lcSQL)
 
SQLDisconnect(0)

3) Tabii en kolay ve hizlisi sbchelper ile SQL bulk copy smile


1-2 ve guzel yontemler smile tesekkur!

3u zaten kullaniyorum cok kayitli yada tumden data gondermem gereken durumlarda bu sadece belli sarta uyan kayitlarin SQLden cekildigi , yedeklendigi ve sonra silindigi durumlarda tekrar SQLe yollamak gerekirse amacli dusundugum bir olay smile

12

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

cetinbasoz yazdı:

Soykan,
Senin yazdigin cast'li yontem hataya acik, benden uyarmasi smile Ozellikle karakter alanlarinda tirnak isareti varsa en basit gocme nedeni.

not aldim! smile

13

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Selamlar;
Çetin abi yıllardır senden beklediğim bir kod var . Sql tabloların user log kayıtlarını almak ile ilgili.
Demiştin ki Ben xml ile alıyorum ama söyleyemem.
Sanırım bu konuya biraz girmiş durumdasın.
Yıllara gark olan merakımı bu günlerde gidermen mümkün mü?
Saygılar.

Bilmediğin Neyse Yanıldığındır.

14

Re: Text...EndText ile SQLe kayit gonderirken numeric alan sorunu

Alemsin mrduyar smile