1

Konu: sql

Arkadaşlar . yeni kayıt yaparken malum aşağıdaki yontemı kullanıyorum
xx='Cihan'
SQLExec(m.lnHandle,[insert into musteri(rec_no,musteriadi) values(4,?xx)])
Burda recnoya dabasede kı son rec_no bulup vermem lazım bu alanda primary key olarak tanımlı
Yeni kayıtta yeni rec_no saysını otomatık nasıl bulup verebilirim. yada onu yerine hangi komut kullanmam gregiyor. Tsekkurler.....

2

Re: sql

Nasil baslarsan oyle gider, sunu nolur duzgun yaz:

Visual Fox Pro
1

2
xx='Cihan' 

SQLExec(m.lnHandle,'insert into musteri(rec_no,musteriadi) values(4,?m.xx)')

recno()'yu unut. Recno filan yok (zaten VFPde de yok aslinda, hesaplanan bir deger). Eger SQL serverda primary key alani olarak IDENTITY kullanirsan o alan otomatik olarak sirayla arttirilip yazilir.

SQL
1

CREATE TABLE musteri ( rec_no int identity PRIMARY KEY , musteriadi varchar(100) )

O zaman senin kodun:

Visual Fox Pro
1

2
xx='Cihan' 

SQLExec(m.lnHandle,'insert into musteri (musteriadi) values (?m.xx)')

Tabii gun gelecek sen bu kaydin otomatik olusturulan rec_no alanina verilen degeri ogrenmek isteyeceksin (rec_no alaninin recno() ile ilgisi yok oyle isim verip kafa karistirma, ideal isimlendirme tabloAdi + ID gibi mesela "MusteriID" ).  O zaman sorun baslayacak. Onu yapmanin N tane yolu var ve ne yazik ki ideal yolu veren kod ben daha gormedim, sen sansli isen gorursun. Temel sorun, o degeri almak icin once o degeri yazman gerekmesi. Her zaman yazma sansin varsa o zaman sorun olmayabilir, basitce geriye scope_identity() dondurebilirsin. O zaman da teker teker insert etmen gerekir. Birden fazla insert etmen gerekirse o ise yaramaz. SQL server'in output clause'dan fayadalanmak su an icin ideal cozumlerden birisi bence.

Oysa sana gerekli olan alti ustu unique bir ID. Bu ID'yi SQL servera yazmasan da onceden alabilsen en iyisi. Neyseki o ID var. GUID olarak taniniyor, SQL serverdaki data tipi "uniqueidentifier". Tabloyu yeniden yaratalim:

SQL
1

2
3
CREATE TABLE musteri ( 

 musteriID uniqueidentifier rowguidcol PRIMARY KEY nonclustered DEFAULT NewID(),
 musteriADI varchar(100) )

Bunda, eger musteriID degerini sen vermezsen, SQL server tarafinda NewID() ile yaratilip yazilacak. Sen vermek istersen VFP'de yaratabilirsin, hatta bagli degilken bile yaratabilirsin, seninki de uniqu oldugu garanti edilen bir deger. Yarattigini insert edersin.

Visual Fox Pro
1

2
3
4
5
6
7
8
9
10
11
* UniqueID.prg

Local pGUID,rGUID
Declare Integer UuidCreate In 'RPCRT4.dll' String @pguid
Declare Integer StringFromGUID2 In 'Ole32.dll' ;
  string rguid, String @lpsz, Integer cchMax
 
pGUID=Replicate(Chr(0),16)
rGUID=Replicate(Chr(0),80)
UuidCreate(@m.pGUID)
StringFromGUID2(m.pGUID,@m.rGUID,40)
Return Strconv(Left(m.rGUID,76),6)

Ornek:

Visual Fox Pro
1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
lnHandle = Sqlstringconnect('Driver={SQL Server Native Client 10.0};server=.\SQL2008;Database=test;Trusted_Connection=yes')

 
TEXT TO m.lcInsert noshow
insert into musteri
   (musteriID, musteriADI)
values
   (?m.ID,?m.musteriAdi);
ENDTEXT
 
Id = UniqueID()
musteriAdi = 'Cihan'
 
SQLExec(m.lnHandle, m.lcInsert)
 
Id = UniqueID()
musteriAdi = 'Ahmet'
 
SQLExec(m.lnHandle, m.lcInsert)
SQLDisconnect(0)

Burada dikkat etmen gereken noktalar:
1) SQL server'a giden emir(ler) text ... endtext arasinda. Yazimi daha kolay, okunabilir, VFP'nin string literal limitleri onemli degil vs. SSMS'de denedigin  kodu oldugu gibi kopyele/yapistir sansin var. (not: sondaki noktali virgulun VFP'dekiyle ilgisi yok. O SQL komutun parcasi, komut sonu).

2) Field adlarini aynen SQL serverda yazdigim gibi kullandim. Bu aslinda onemli olmayabilirdi ama ne yazik ki field adinda iI geciyorsa onemli (Turkce ayarlarin oldugu bir makinede musteriadi diye yarattiysan bunun buyuk harfli sekli MUSTERİADİ. Bu ayrintilar insana kafa yediriyor ondan soyledim)

3) Benim tembellik nedeniyle yapmadigim (biraz da simdiden kafan karismasin diye).
a) Ayni komut birden fazla kullanilacaksa, SQLPrepare() ve SQLExec() tercih.
b) SQLExec() sonuclarini kontrol et. Eger -1 ise Aerror() kullanarak nedenine bak.:

Visual Fox Pro
1

2
3
4
if SQLExec( ... ) < 0 

  Aerror(aNeden)
  MessageBox( aNeden[2] ) && 7'sinden en cok ise yarayan 2
endif

Not: Bu arada SQLExec()'ten kisa surede kurtulmani tavsiye ederim. Cursoradapter ve ADO. VFP'nin ODBC driverlar ile basi dertte ve bundan sonra da birseyin duzeltilecegini sanmam.

Son düzenleyen, cetinbasoz (15.04.2010 08:14:26)

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

3

Re: sql

bu konuda sana katılmıyorum. bence select @@identity yeterli. ayrıca oracle kullanacakları da uyarmam lazım. guid oracle'nın bazı versiyonlarında düzgün çalışmıyormuş. oracle zaten uniq id olayını çok güzel halletmiş. uniq id üretecek özel tablolar oluşturabiliyorsun. her select te numarayı bir arttırıp sana geri gönderiyor. garantili uniq id ve guid'den daha az yer kaplıyor.

sqlexec ile ilgili ne problem var? bunu duyduğum iyi olmadı. ben direk kodlar çalıştırıyorum sql exec ile. ayrıca sql program parçacıkları da yazıyorum ve onunla çalıştırıyorum. onu da başka türlü yapamam heralde? yoksa yapabilir miyim?

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

4

Re: sql

CREATE TABLE musteri ( cari_id  int identity PRIMARY KEY , musteriadi varchar(100) )

Bu şekilde denedim cari_id  otomatik artırılan bir numara ile devam ediyor. Bütün cari hareketlerini bu Id üzerinden bağlantı kuracam .Böyle işimi gördü çok tsekkurler. ..

Ayrıca  Sql yeni beni şaşırtan birsey oldu. database alan uzunlugu ör: musteriid varchar(100) degısken uzunlugu 110 karekter boyunda ise kayır yapmıyor database yani fox ta 100 kadarını kesip kayıy yapıyordu ama bunda yapamadım . bi hatammmı var acaba

5

Re: sql

metin yazdı:

bu konuda sana katılmıyorum. bence select @@identity yeterli. ayrıca oracle kullanacakları da uyarmam lazım. guid oracle'nın bazı versiyonlarında düzgün çalışmıyormuş. oracle zaten uniq id olayını çok güzel halletmiş. uniq id üretecek özel tablolar oluşturabiliyorsun. her select te numarayı bir arttırıp sana geri gönderiyor. garantili uniq id ve guid'den daha az yer kaplıyor.

sqlexec ile ilgili ne problem var? bunu duyduğum iyi olmadı. ben direk kodlar çalıştırıyorum sql exec ile. ayrıca sql program parçacıkları da yazıyorum ve onunla çalıştırıyorum. onu da başka türlü yapamam heralde? yoksa yapabilir miyim?

Ya Metin,
Tamam bana katilma ama hic olmazsa @@identity gibi en kotu secenegi onerme:) Onunla aldigin identitye hic guvenemezsin. Mesela 2 kayitli tablona bir kayit eklediginde geriye 15000 ya da 1 alirsan hic sasirma nedeni @@identity. Scope_Identity() o grubun tek guvenilebilir elemani. Bana katilmasan da bende ornek cok ama vakit simdilik yok.

SQLExec ile problem, yeni data tipleriyle VFP ne yapacagini bilemiyor. Farkli driverlarla farkli sonuclar aliyorsun. Defalarca degisik forumlarda ornek kodla gostermistim. Aklima geldikce bazen postaliyorum yeni buldugum buglari ( destek bitti bug bulmak bitmedi:( Kendimi tanimasam VFP dusmanligi yapiyorum diyicem smile

"yoksa yapabilir miyim?" Tabii yaparsin. ADO.

Son düzenleyen, cetinbasoz (15.04.2010 11:56:19)

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

6

Re: sql

petkomahmet yazdı:

CREATE TABLE musteri ( cari_id  int identity PRIMARY KEY , musteriadi varchar(100) )

Bu şekilde denedim cari_id  otomatik artırılan bir numara ile devam ediyor. Bütün cari hareketlerini bu Id üzerinden bağlantı kuracam .Böyle işimi gördü çok tsekkurler. ..

Ayrıca  Sql yeni beni şaşırtan birsey oldu. database alan uzunlugu ör: musteriid varchar(100) degısken uzunlugu 110 karekter boyunda ise kayır yapmıyor database yani fox ta 100 kadarını kesip kayıy yapıyordu ama bunda yapamadım . bi hatammmı var acaba

Hatan 100 uzunlugundaki yere 110 karakter sigdirmaya calismak:) SQL server, VFP gibi degil, ciddi bir database. VFP'nin kesip atmasi hata. Kesip attigini sen ne zaman ogreniyorsun bir dusun:)

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

7

Re: sql

cetinbasoz yazdı:

...
Ya Metin,
Tamam bana katilma ama hic olmazsa @@identity gibi en kotu secenegi onerme:) ...
"yoksa yapabilir miyim?" Tabii yaparsin. ADO.

heralde bunu kastediyorsun. bunu biliyordum ben. trigger vs.. gibi şeyler kullanmadığım ve identity'yi hemen insert sonrası aldığım için öyle bir problemim yok. ama eğer başka şeyler varsa scope_identity() i kullanırım ben de.

SCOPE_IDENTITY and @@IDENTITY return the last identity values that are generated in any table in the current session. However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

For example, there are two tables, T1 and T2, and an INSERT trigger is defined on T1. When a row is inserted to T1, the trigger fires and inserts a row in T2. This scenario illustrates two scopes: the insert on T1, and the insert on T2 by the trigger.

Assuming that both T1 and T2 have identity columns, @@IDENTITY and SCOPE_IDENTITY will return different values at the end of an INSERT statement on T1. @@IDENTITY will return the last identity column value inserted across any scope in the current session. This is the value inserted in T2. SCOPE_IDENTITY() will return the IDENTITY value inserted in T1.




ben gerçi hiçbir yeni veri türünü kullanmıyorum. sql-2000'den sonrası yokmuş gibi davranıyorum. çünkü sql2000 kullanan müşterilerimiz var ve hiçbiri de upgrade düşünmüyor. ama yine de ado ile sqlexec işini nasıl yapabileceğimi anlatan bir örnek var mı? madem daha düzgün çalışıyor. onu kullanalım di mi?

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

8

Re: sql

loCon.Execute(...) en basiti:) Onun disinda Stored Procedure, Parameters vs destegi tonla. Aslinda onda yapabildiklerinin tamamini SQLExec() ile yapabilir misin acaba (yuksek sesle dusunuyorum, yapamayacagin seyleri buldugumdan degil, SQL server VFP gibi degil ODBC driverlarini da guncelliyor - ama garibim VFP kendisine geleni anlayamiyor. Gerci OLEDB kullaninca da kendisinin kendisine gonderdigini de anlayamadigi icin beni tilt ediyor o ayri mesele:).

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

9

Re: sql

Metin abi neyapacaz sqlexec daha yeni baslamısken bırakacakmıyız bu komutu.

10

Re: sql

Ya 2010 yilinda MS SQL kullanmaya basliyorsun, millet VFP8-9'un CursorAdapter yeniligini ve dolayisiyla basit ADO destegini yillardir takdir ediyor sen hala ODBC ve SQLExec() kullanamayacak miyiz diye hayiflaniyorsun:) Kullan, hala destekliyor, sadece hatalarina takildiginda uzulme. Hatalar cok degil belki de sen hic karsilasmazsin, yeni ozel tipleri kullanmaya kalkmazsan.

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

11

Re: sql

Metin,
Arcelik kafayi yemis olmali (ya da bana gore akillanmis:)


Turkey’s Arcelik Moving 5 Terabyte SAP database from Oracle to SQL Server 2008

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

12

Re: sql

eski sistemleri sun/solaris'miş. sun/solaris'in daha yavaş olduğunu sun bile gizlemiyor. ama dünyanın en sağlam server sistemi. kimse 365/24 bir sistemi windows'a emanet etmez.
kusura bakma ama bence kafayı yemiş arçelik gerçekten. turkcell türkiye'de tek (sadece gsm değil her türlü firma olarak) dünyada da sayılı gsm operatörlerinden. oracle kullanıyorlar. ve de turkcell database'nin yanında arçeliğin database çekirdek kalır. ya da denizde kum.
bu kadar ileri düzeyde bir kullanıcı olup ta hala opera ya da en azından firefox yerine ie kullanan birine tarafsız diyemem ben...  tamam bilgine saygım var ama tarafsın... wink

Son düzenleyen, metin (19.04.2010 11:58:07)

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

13

Re: sql

Tamam seninki sabit fikir:)

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

14

Re: sql

cetinbasoz yazdı:

Tamam seninki sabit fikir:)

benim silahımla saldırıyorsun... smile

öyle olsun. microsoft'un hiçbir zaman hakim olamayacağı iki pazar var benim görüşümce: 1-erp, 2-database. ikisinde de microsoft sadece ufaklarda başarılı.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com