1

Konu: Cursor Adapter Hk.

Üstat  ve Usta lardan "Cursor Adapter" hakkında biraz temel bilgi almamız mümkün olabilir mi?

SPT mi daha kullanışlıdır yoksa Cursor Adapter mi? Yada her ikisininde kendine göre avantajları mı vardır?

Sınıf olarak bir data environment içerisinde nasıl kullanabilriz ( yada kullanmalı isek nerede ve nasıl kullanabiliriz? )

Konu hakkında sormak istediğim çok şey var ama SPT nin genel çalışma mantığını ve beckend kısmının nasıl yürüdüğünü iyi bildiğim halde CA hakkında hiç bilgim yok. Acaba gereksiz şey(ler)mi soruyorum diyer kendime hayıflanıyorum bir yandan.

Özetle :
-----------
1. CA nedir?

2. Nerede ve nasıl kullanırılır?

3. Avantajları / dezavantajları nelerdir?

4. Hiç CA kullanmadan tüm işleri SPT ile yapmak mümkün olurmu. Olursa işi çok mu uzatırız?,

5. Konu hakkında basit ve "açıklamalı" bir örnek alabilirmiyiz?

Yorum ve açıklama yapan herkes için şimdiden çok teşekkür ediyorum.

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ü

2

Re: Cursor Adapter Hk.

CA daha kullanisli.

1) CA bir class. Herhangi bir veri kaynagi icin 'adaptor'.
2) Cursorlarin kullanildigi her yerde kullanilabilir. O class'tan bir obje yaratirsin, Cursorfill() ile cursor olusturup kullanirsin.
3) RV ve SPT'de sadece ODBC kullanma olanagi var. CA'da ise ODBC,OLEDB, XML ya da native kaynak olabilir. CA ile yazdiysan, farkli kaynaklara adaptasyon cok daha kolay. Butun yapman gereken farkli bir classtan objeni yaratmak. Ornegin:

Visual Fox Pro
oCustomer = createobject( "CA_Customer","SQLServer.prg")

oCustomer = createobject( "CA_Customer","VFP.prg")
oCustomer = createobject( "CA_Customer","Oracle.prg")
 
* oCustomer.Alias = 'Customer'
oCustomer.Cursorfill(....)

SPT'de cursor schema belirleyemiyorsun, CA'da (ve RV'de) var. RV ve SPT'de update optimizasyonu yapamiyorsun, CA'da var. CA'nin eventleri var (bazen ise yariyabilir), SPT'de yok.  SPT'de sadece ODBC kullanmak, gelisen ODBC'ye artik ayak uyduramayan VFP'nin hatalarini da kabullenmek demek.

En buyuk dezavantaji, cok buyuk bir class, tamamini ogrenmek cok zaman alir. Veri kaynagini da taniman lazim, veri kaynagina gore davranislar farkli olabiliyor.

4) Hic CA kullanmadan SPT ile yapmak mumkun olabilir, senin veri kaynagin ve kulladigin data tiplerine bagli. Datatipleri gelisyor, degisiyor ama VFP ODBC degerlendirmesi hala gecmiste kaldi ve artik duzeltilme umudu da yok (benim yok en azindan).

5) Istanbul'da Soykan'in gosterdigi formu hatirliyor musun? O basitce bir takim SQL...() fonksiyonu uzerinden CA kullaniyordu. Dogrudan onlari kullanirsan hemen CA kullanmaya baslaman mumkun. Gelecek hafta sonu istersen hizli bir sekilde bakariz.

3

Re: Cursor Adapter Hk.

Selamlar;

CA ile ilgili istanbulda ki toplantıda gösterilen çok güzel bir örnek vardı. Elinde olan arkadaş var ise yayınlarsa çok iyi olur sanırım.

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

4

Re: Cursor Adapter Hk.

Merhaba Ramazan;

O örneklerin bende olması lazım. Evdeki PC ye kopyalamış olmalıyım diye hatırlıyorum. 1-2 güne kadar isteyen arkadaşlara mail atabilirim.

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ü

5 Son düzenleyen, ugurlu2001 (08.02.2010 15:57:59)

Re: Cursor Adapter Hk.

Üstad,

Öncelikle ellerine sağlık.

Senin yazdıklarını görmeden önce dün akşam bende biraz CA çalıştım. Daha doğrusu konu hakkında yüzeysel bir araştırma yapabildim.

En basit olarak sormak istediğim şu:

Diyelim ki bir ürünümüz var. Kodu "ABC-001" olsun.

"ABC-001" kodlu ürünü "001 Cari" nolu firmaya çıktım.

Aşağıdaki 3 işlemi yapmak istiyorum :

1. "ABC-001" kodlu ürünü otomatik olarak stok dosyamdan düşmeli
2. "001 Cari" nolu firmanın bakiyesi, ürünün satışı fiyatı kadar artsın.
3."ABC-001" ürünün satılan adedi kadar otomatik olarak sipariş dosyama eklensin.

Böyle bir yöntemde: hem Stok, Hem Cari hemde Sipariş dosyaları üzerinde işlem yapmak gerekiyor.

** Cursor Adapter ile bu işlemlerin nasıl olması gerektiğini tam kavrayamadım.

SQL Server ile  BeginTRan / EndTran arasında Transac komutları yazarak işimizi görebiliyoruz. Sorun olduğunda Rollback - sorun yoksa Commit . Begin / End aralığında başka bir kullanıcı / işlemin bizi kesmediğini, parçalı işlem yapmadığımızı garanti ediyoruz.

Bu kadar basit ( yada bana öyle geliyor. )

Ancak SPT ile de 3 farkı Cursor 'e ait datayı VFP içerisinden dinamik bir şekilde nasıl yolluycaz?

Kafam öyle karıştı ki? Basit bir örnek istesem çok mu olurum. Yada zor bir şey mi istiyorum.

Yorum ve açıklamalar için şimdiden çok ama çok teşekkür ediyorum...

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ü

6

Re: Cursor Adapter Hk.

Eger bahsedilen benim bulusma icin yaptigim ornek ise asagidaki linkten projeyi ve SQL Datayi indirebilir.
www.soykansoft.com/downloads/depomatik_sql.rar && Project
www.soykansoft.com/downloads/fox4um_sql_data.rar && SQL Data


bulusmada anlatmistim kısaca yine belirtmek isterim. burada kullanilan yontem varolan VFP datasini Cetin hocanin SQL Class lari ile SQL olarakta kullanabilmeyi saglaması

olmazsa olmazlar
1-tablolar DataEnvironmentta olmali

2-SQL Serverda tablo ve field lar ayni isme sahip olmali ( classlar runtime da DE deki tablolari basamak olarak kullanip CA donusumlerini yapiyor       SQL serverdan datayi getiriyor )

3-ca_vfp.prg ve ca_sql.prg lerde SQL Class larin kullanacagiz Schemalar tanimlanmis olmali ( Bknz:) libs\ca_vfp.prg ve libs\ca_sql.prg)

4-projedeki formlardaki Data Envrimonment ta Before Open Tables kısmına bakın UpdateDe(this) komutu ile yukarida anlattigim donusumlerin yaptirildigi yer , updateDE.prg kodlarini inceleyin.

kısaca boyle projeyi incelediginizde fikir sahibi olacaginizi dusunuyorum.

scriptle SQL Data yaratmak isterseniz.

* database olusturan Script

SQL
USE [master]

GO
 
/****** Object:  Database [fox4um]    Script Date: 02/08/2010 16:11:11 ******/
CREATE DATABASE [fox4um] ON  PRIMARY
( NAME = N'fox4um', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\fox4um.mdf' , SIZE = 4352KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'fox4um_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\fox4um_log.LDF' , SIZE = 1088KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
 
ALTER DATABASE [fox4um] SET COMPATIBILITY_LEVEL = 100
GO
 
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [fox4um].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
 
ALTER DATABASE [fox4um] SET ANSI_NULL_DEFAULT OFF
GO
 
ALTER DATABASE [fox4um] SET ANSI_NULLS OFF
GO
 
ALTER DATABASE [fox4um] SET ANSI_PADDING OFF
GO
 
ALTER DATABASE [fox4um] SET ANSI_WARNINGS OFF
GO
 
ALTER DATABASE [fox4um] SET ARITHABORT OFF
GO
 
ALTER DATABASE [fox4um] SET AUTO_CLOSE OFF
GO
 
ALTER DATABASE [fox4um] SET AUTO_CREATE_STATISTICS ON
GO
 
ALTER DATABASE [fox4um] SET AUTO_SHRINK OFF
GO
 
ALTER DATABASE [fox4um] SET AUTO_UPDATE_STATISTICS ON
GO
 
ALTER DATABASE [fox4um] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
 
ALTER DATABASE [fox4um] SET CURSOR_DEFAULT  GLOBAL
GO
 
ALTER DATABASE [fox4um] SET CONCAT_NULL_YIELDS_NULL OFF
GO
 
ALTER DATABASE [fox4um] SET NUMERIC_ROUNDABORT OFF
GO
 
ALTER DATABASE [fox4um] SET QUOTED_IDENTIFIER OFF
GO
 
ALTER DATABASE [fox4um] SET RECURSIVE_TRIGGERS OFF
GO
 
ALTER DATABASE [fox4um] SET  ENABLE_BROKER
GO
 
ALTER DATABASE [fox4um] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
 
ALTER DATABASE [fox4um] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
 
ALTER DATABASE [fox4um] SET TRUSTWORTHY OFF
GO
 
ALTER DATABASE [fox4um] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
 
ALTER DATABASE [fox4um] SET PARAMETERIZATION SIMPLE
GO
 
ALTER DATABASE [fox4um] SET READ_COMMITTED_SNAPSHOT OFF
GO
 
ALTER DATABASE [fox4um] SET HONOR_BROKER_PRIORITY OFF
GO
 
ALTER DATABASE [fox4um] SET  READ_WRITE
GO
 
ALTER DATABASE [fox4um] SET RECOVERY FULL
GO
 
ALTER DATABASE [fox4um] SET  MULTI_USER
GO
 
ALTER DATABASE [fox4um] SET PAGE_VERIFY CHECKSUM 
GO
 
ALTER DATABASE [fox4um] SET DB_CHAINING OFF
GO

* SQL tabloları olusturan script

SQL
USE [fox4um]

GO
/****** Object:  Table [dbo].[stok]    Script Date: 02/08/2010 16:09:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[stok](
    [skodu] [char](16) NOT NULL,
    [sadi] [char](25) NULL,
    [birim] [char](3) NULL,
    [myguid] [char](38) NOT NULL,
CONSTRAINT [PK_stok] PRIMARY KEY NONCLUSTERED
(
    [myguid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[siparisd]    Script Date: 02/08/2010 16:09:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[siparisd](
    [sipno] [int] NOT NULL,
    [skodu] [char](16) NULL,
    [miktar] [float] NULL,
    [fiyat] [float] NULL,
    [tutar] [float] NULL,
    [myguid] [char](38) NOT NULL,
    [pmyguid] [char](38) NOT NULL,
CONSTRAINT [PK_siparisd] PRIMARY KEY NONCLUSTERED
(
    [myguid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[siparisb]    Script Date: 02/08/2010 16:09:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[siparisb](
    [sipno] [int] IDENTITY(5,1) NOT FOR REPLICATION NOT NULL,
    [tarih] [datetime] NULL,
    [ckodu] [char](16) NULL,
    [myguid] [char](38) NOT NULL,
CONSTRAINT [PK_siparisb] PRIMARY KEY NONCLUSTERED
(
    [myguid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[params]    Script Date: 02/08/2010 16:09:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[params](
    [_datapath] [char](10) NULL,
    [_server] [char](10) NULL,
    [_username] [char](10) NULL,
    [_password] [char](10) NULL,
    [_datamode] [char](10) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[firma]    Script Date: 02/08/2010 16:09:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[firma](
    [firmaadi] [char](50) NULL,
    [ssksicilno] [char](15) NULL,
    [arkaresim] [char](100) NULL,
    [yetkili] [char](30) NULL,
    [adres1] [char](50) NULL,
    [adres2] [char](50) NULL,
    [tel] [char](15) NULL,
    [fax] [char](15) NULL,
    [email] [char](30) NULL,
    [gsm] [char](15) NULL,
    [vda] [char](20) NULL,
    [vno] [char](10) NULL,
    [banka1] [char](25) NULL,
    [hesap1] [char](15) NULL,
    [banka2] [char](25) NULL,
    [hesap2] [char](15) NULL,
    [banka3] [char](25) NULL,
    [hesap3] [char](15) NULL,
    [foto] [char](20) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[cari]    Script Date: 02/08/2010 16:09:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[cari](
    [myguid] [char](38) NOT NULL,
    [ckodu] [char](16) NOT NULL,
    [cadi] [char](25) NULL,
CONSTRAINT [PK_cari] PRIMARY KEY NONCLUSTERED
(
    [myguid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Default [dbo].[UW_ZeroDefault]    Script Date: 02/08/2010 16:09:51 ******/
CREATE DEFAULT [dbo].[UW_ZeroDefault] AS 0
GO
/****** Object:  Table [dbo].[user01]    Script Date: 02/08/2010 16:09:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[user01](
    [idno] [char](10) NOT NULL,
    [kull] [char](10) NULL,
    [sifre] [char](10) NULL,
    [level] [char](1) NULL,
    [supervisor] [bit] NOT NULL,
    [formadi] [char](30) NULL,
    [formtanimi] [char](30) NULL,
    [oku] [bit] NOT NULL,
    [yaz] [bit] NOT NULL,
    [duzenle] [bit] NOT NULL,
    [sil] [bit] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[user]    Script Date: 02/08/2010 16:09:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[user](
    [userid] [int] NOT NULL,
    [idno] [char](10) NOT NULL,
    [kull] [char](10) NULL,
    [sifre] [char](10) NULL,
    [level] [char](1) NULL,
    [supervisor] [bit] NOT NULL,
    [formadi] [char](30) NULL,
    [logged] [bit] NOT NULL,
    [macid] [char](12) NULL,
    [depokodu] [char](3) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Default [DF_cari_myguid]    Script Date: 02/08/2010 16:09:53 ******/
ALTER TABLE [dbo].[cari] ADD  CONSTRAINT [DF_cari_myguid]  DEFAULT (newid()) FOR [myguid]
GO
/****** Object:  Default [DF_siparisb_myguid]    Script Date: 02/08/2010 16:09:53 ******/
ALTER TABLE [dbo].[siparisb] ADD  CONSTRAINT [DF_siparisb_myguid]  DEFAULT (newid()) FOR [myguid]
GO
/****** Object:  Default [DF_siparisd_myguid]    Script Date: 02/08/2010 16:09:53 ******/
ALTER TABLE [dbo].[siparisd] ADD  CONSTRAINT [DF_siparisd_myguid]  DEFAULT (newid()) FOR [myguid]
GO
/****** Object:  Default [DF_stok_myguid]    Script Date: 02/08/2010 16:09:53 ******/
ALTER TABLE [dbo].[stok] ADD  CONSTRAINT [DF_stok_myguid]  DEFAULT (newid()) FOR [myguid]
GO

* ornek Data Insert

SQL
SET NUMERIC_ROUNDABORT OFF

GO
SET XACT_ABORT, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS, NOCOUNT ON
GO
SET DATEFORMAT YMD
GO
-- Pointer used for text / image updates. This might not be needed, but is declared here just in case
DECLARE @pv BINARY(16)
 
BEGIN TRANSACTION
 
-- Add 1 row to [dbo].[firma]
INSERT INTO [dbo].[firma] ([firmaadi], [ssksicilno], [arkaresim], [yetkili], [adres1], [adres2], [tel], [fax], [email], [gsm], [vda], [vno], [banka1], [hesap1], [banka2], [hesap2], [banka3], [hesap3], [foto]) VALUES (N'SoykanSoft                                        ', N'12345678901    ', NULL, N'Soykan ÖZÇELİK                ', N'address                                           ', NULL, NULL, NULL, N'soykan@soykansoft.com         ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, N'firma_foto.png      ')
 
-- Add 1 row to [dbo].[params]
INSERT INTO [dbo].[params] ([_datapath], [_server], [_username], [_password], [_datamode]) VALUES (NULL, N'FOX_W7_RTM', NULL, NULL, N'SQL       ')
 
-- Add 10 rows to [dbo].[cari]
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'{CFC450B0-B346-40D2-A31F-7E4C34AAB54D}', N'S-001           ', N'Soykan ÖZCELIK           ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'{F91C52C2-F177-485C-A761-578378F5F1D7}', N'C-001           ', N'Cetin BASOZ123           ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'0F63D0B4-4F39-448A-9C87-B0A30CD0D5C3  ', N'AO              ', N'Ata ÖZÇELİK              ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'36C4492D-AD8D-472B-9622-814390DF0650  ', N'CC              ', N'cihan cakmak smile          ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'6C5E5798-2A8D-4114-A8E7-C349A2E95CEF  ', N'T001            ', N'Timucin ARAL             ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'6C79B9DC-0ABF-4E45-9E5A-1AD7F1DD4690  ', N'JUKI            ', N'BHFFFF                   ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'89F35A6F-A607-4ECA-9D2A-5DFE0E0B0DA1  ', N'eeeee           ', N'eeeee                    ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'AAF7D987-CA94-4969-BEEF-0D5833FB8223  ', N'EY              ', N'Erdal YALCIN             ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'D0BCE6AA-D8B4-4990-9C60-6526ADD2207A  ', N'DH              ', N'Dila Hatem ÖZÇELİK       ')
INSERT INTO [dbo].[cari] ([myguid], [ckodu], [cadi]) VALUES (N'E230D7C7-294C-4C9F-8C19-D98AE47E685C  ', N'sdsdf           ', N'FFFFFFFFFFFFFFFFFFFF     ')
 
-- Add 2 rows to [dbo].[siparisb]
SET IDENTITY_INSERT [dbo].[siparisb] ON
INSERT INTO [dbo].[siparisb] ([myguid], [sipno], [tarih], [ckodu]) VALUES (N'4526CFAB-9CB4-4932-8BF7-0EDF82B928B2  ', 5, '2009-10-21 00:00:00.000', N'S001            ')
INSERT INTO [dbo].[siparisb] ([myguid], [sipno], [tarih], [ckodu]) VALUES (N'75684BA5-BBDA-4C95-B210-9B5CC466602D  ', 6, '2009-12-04 00:00:00.000', N'BEN             ')
SET IDENTITY_INSERT [dbo].[siparisb] OFF
 
-- Add 8 rows to [dbo].[siparisd]
INSERT INTO [dbo].[siparisd] ([myguid], [sipno], [skodu], [miktar], [fiyat], [tutar], [pmyguid]) VALUES (N'1383F0DF-2DE5-46E1-8BE0-857BCA079682  ', 6, N'HYU             ', 11, 23, NULL, N'75684BA5-BBDA-4C95-B210-9B5CC466602D  ')
INSERT INTO [dbo].[siparisd] ([myguid], [sipno], [skodu], [miktar], [fiyat], [tutar], [pmyguid]) VALUES (N'317CBB50-F7B6-4CFE-BA2C-BC71C65F57E5  ', 5, N'CCCC            ', 78, 78, NULL, N'4526CFAB-9CB4-4932-8BF7-0EDF82B928B2  ')
INSERT INTO [dbo].[siparisd] ([myguid], [sipno], [skodu], [miktar], [fiyat], [tutar], [pmyguid]) VALUES (N'53E88771-DAB7-46E4-A757-93B582A7CADE  ', 0, N'O               ', 12, 12, NULL, N'{145FE240-B586-46FF-AF9B-1A352C44D9E8}')
INSERT INTO [dbo].[siparisd] ([myguid], [sipno], [skodu], [miktar], [fiyat], [tutar], [pmyguid]) VALUES (N'7CE655B5-4F0C-4AC8-8885-9D3028D8ED4B  ', 6, N'HKK             ', 12, 3, NULL, N'75684BA5-BBDA-4C95-B210-9B5CC466602D  ')
INSERT INTO [dbo].[siparisd] ([myguid], [sipno], [skodu], [miktar], [fiyat], [tutar], [pmyguid]) VALUES (N'9A4251BD-1FD0-46B6-A2EF-1E3B27255EF6  ', 0, N'SQL             ', 10, 2, NULL, N'{E08FB2A8-C449-46DA-8E45-CE6D8083E134}')
INSERT INTO [dbo].[siparisd] ([myguid], [sipno], [skodu], [miktar], [fiyat], [tutar], [pmyguid]) VALUES (N'9FC6330D-2769-446D-9502-3A4AD92D006D  ', 6, N'HY              ', 12, 23, NULL, N'75684BA5-BBDA-4C95-B210-9B5CC466602D  ')
INSERT INTO [dbo].[siparisd] ([myguid], [sipno], [skodu], [miktar], [fiyat], [tutar], [pmyguid]) VALUES (N'AE28B9A2-6729-43FD-923B-F6AD3CA2F9C0  ', 6, N'JU              ', 23, 23, NULL, N'75684BA5-BBDA-4C95-B210-9B5CC466602D  ')
INSERT INTO [dbo].[siparisd] ([myguid], [sipno], [skodu], [miktar], [fiyat], [tutar], [pmyguid]) VALUES (N'E6EF64FB-B1D6-4D2B-B1CA-D8D837C8115D  ', 5, N'NHJ             ', 334, 34, NULL, N'4526CFAB-9CB4-4932-8BF7-0EDF82B928B2  ')
 
-- Add 2 rows to [dbo].[stok]
INSERT INTO [dbo].[stok] ([myguid], [skodu], [sadi], [birim]) VALUES (N'D973D582-CF3B-4559-9B45-31DFF5C862C5  ', N'SQL3            ', N'SQL33333                 ', N'AD ')
INSERT INTO [dbo].[stok] ([myguid], [skodu], [sadi], [birim]) VALUES (N'E8DD56B2-86E7-447A-B40E-BD7A160C71D2  ', N'SQL             ', N'SQLll                    ', N'm3 ')
 
COMMIT TRANSACTION
GO

7 Son düzenleyen, metin (08.02.2010 16:32:07)

Re: Cursor Adapter Hk.

UT'de benim cursor adapter class'ımı indirirsen (sadece sql server ile çalışıyor), o senin yerine cursor adapter kodlarını bir .prg içine yazıyor. data environment'tan builder ile bazı problemler çıkıyor. bunda o problemler yok.

http://www.universalthread.com/Report.a … 6E33546553

mesela benim class longint ve varchar alanları doğru görüyor. char olarak almıyor. builderde 512 karakter problemi var. "i" harfi kullanılan fieldlarda problemler yaşanıyor. onları tek tek elle düzeltmek gerekiyor.

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

8

Re: Cursor Adapter Hk.

yalnız linq'yu sadece ucundan inceledim ve şunu söyleyebilirim bizim cursor adapter hikaye. mesela foreign key olayı linq ile harika birşey haline geliyor. onları otomatik kullanıyor. birçok şeyi senden alıyor.

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

9

Re: Cursor Adapter Hk.

Örnekler ve açıklamalar için teşekkür ediyorum.

Galiba Cursor Adapter öyle bir çırpıda yutulup yenilicek bir konu değil.  Biraz çalışıp takıldığım yerleri sormak daha mantıklı gibi görünüyor.

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ü

10 Son düzenleyen, metin (08.02.2010 16:37:54)

Re: Cursor Adapter Hk.

Soykan,
bir iki eleştiri:
myguid alanının tipini "uniqueidentifier" olarak tanıtsaydın daha az yer kaplardı.
ayrıca bu alanı primary key yapman gereksiz. çünkü zaten eşsiz oluyor. ben olsam sipno yu primary key yapardım. Ha bir de sipno yu ben şahsen int değil karakter yapardım. mesela A000000001 diye bir sipariş no da vermek isteyebilir kullanıcı. ayrıca sipno'yu identity yapmazdım. çünkü kullanıcı atlamalar veya geriye dönmeler yapmak isteyebilir.

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

11

Re: Cursor Adapter Hk.

Olayi isin icine CA, SPT filan karistirmadan dusun. Begin Transaction .. end transaction ilk akla gelenler ama soyledigin islem daha cok triggerlara uyuyor. Bunu trigger olarak yazarsan aslinda tek yapman gereken tek dosyada update/insert. Trigger basarili olursa update/insert basarili olur olmazsa o da olmaz (her SQL server batch komutu kendi icinde atomik olarak transactional ayrica Begin Transaction da gereksiz).
Transaction kullanmak istersen (normalde transaction uygulaniyor ama update basian), CA'da UseTransactions propertysini .F. yapip kendin baslatip bitirebilirsin de. CA'nin bir avantaji da, UpdateCmd, InsertCmd ayri yazilabilir. Mesela UpdateCmd icindeki komut duz:
Update ...

yerine:

if ...
   update ....
   insert  ....

gibi birsey de olabillir.

12

Re: Cursor Adapter Hk.

Üstat, sen açıklıyorsun ama böyle kısacık da açıklanmaz ki.

Visual Fox Pro
CA'da UseTransactions propertysini .F. yapip kendin baslatip bitirebilirsin de.

Açıklaması ile bam teline bastın smile

O zaman bir soru daha :
VFP tarafında Connection u açtıktan sonra aynı connection üzerinde  1 den fazla (2-3 yada dört .. ) Insert, Delete, Update işlemini bir tek TRansaction içerisinde yapabiliyoruz yani öylemi? Yani 1. işlemde Transaction u başlat, en sonuncuda bitir. Data bütünlüğü %100 garanti?

Yoksa ben mi yanlış anladım...

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ü

13

Re: Cursor Adapter Hk.

metin yazdı:

Soykan,
bir iki eleştiri:
myguid alanının tipini "uniqueidentifier" olarak tanıtsaydın daha az yer kaplardı.
ayrıca bu alanı primary key yapman gereksiz. çünkü zaten eşsiz oluyor. ben olsam sipno yu primary key yapardım. Ha bir de sipno yu ben şahsen int değil karakter yapardım. mesela A000000001 diye bir sipariş no da vermek isteyebilir kullanıcı. ayrıca sipno'yu identity yapmazdım. çünkü kullanıcı atlamalar veya geriye dönmeler yapmak isteyebilir.

cok fazla titiz dusunerek yapilmis bir ornek degil ancak MyGUID alanini VFP ve  SQL de sadece mod degisikligi yaparak kullanabilmek icin oyle tutmak zorunda kaldim.

sipnolar konusunda aslinda o sipno degilde sipislemno olsa daha iyi olurdu smile siparis dedigin gibi char daha mantikli .
sipislemno identity yerine sequantil olabilecek sen ne onerirsin?

14

Re: Cursor Adapter Hk.

Soykan,
Olmazsa olmaz maddeleri 1 ve 2 benim verdiklerim ile ilgili degil sanirim. Bende oyle bir kisitlama yok, hatta tersi tesvik ediliyor:)

15

Re: Cursor Adapter Hk.

metin yazdı:

yalnız linq'yu sadece ucundan inceledim ve şunu söyleyebilirim bizim cursor adapter hikaye. mesela foreign key olayı linq ile harika birşey haline geliyor. onları otomatik kullanıyor. birçok şeyi senden alıyor.

'Bizim cursoradapter hikaye' smile Ah Metin, bilsen ben VFP'de nelerin hikaye oldugunu dusunmeye basladim. Bir taraftan yillarca VFP sayesinde ekmek yedik, diger taraftan eger o olmasaymis gozum daha once acilabilirmis diye dusunuyorum bazen. Cok fazla 2D dusundurtmus beni:) Hainmiyim neyim.

16

Re: Cursor Adapter Hk.

ugurlu2001 yazdı:

Üstat, sen açıklıyorsun ama böyle kısacık da açıklanmaz ki.

Visual Fox Pro
CA'da UseTransactions propertysini .F. yapip kendin baslatip bitirebilirsin de.

Açıklaması ile bam teline bastın smile

O zaman bir soru daha :
VFP tarafında Connection u açtıktan sonra aynı connection üzerinde  1 den fazla (2-3 yada dört .. ) Insert, Delete, Update işlemini bir tek TRansaction içerisinde yapabiliyoruz yani öylemi? Yani 1. işlemde Transaction u başlat, en sonuncuda bitir. Data bütünlüğü %100 garanti?

Yoksa ben mi yanlış anladım...

Kisaca evet. Ama CA ile SPT'yi de cok karistirma. SPT'de komutlar var. CA'nin connectionu uzerinde de komutlar olabilir. Baska bir benzetme sekli:

SPT ile aldigin cursor, CA cursor gibi dusun. CA arada kaynakla nasil haberlesecegini belirleyen adaptor sadece. Mesela sendeki kodlarin icerisinde SQLInsert.prg olacak. O sadece insert islemi icin. SPT'deki Insert ... komutunu ADO ile yapiyor.

17 Son düzenleyen, cetinbasoz (08.02.2010 17:22:30)

Re: Cursor Adapter Hk.

metin yazdı:

Soykan,
bir iki eleştiri:
myguid alanının tipini "uniqueidentifier" olarak tanıtsaydın daha az yer kaplardı.
ayrıca bu alanı primary key yapman gereksiz. çünkü zaten eşsiz oluyor. ben olsam sipno yu primary key yapardım. Ha bir de sipno yu ben şahsen int değil karakter yapardım. mesela A000000001 diye bir sipariş no da vermek isteyebilir kullanıcı. ayrıca sipno'yu identity yapmazdım. çünkü kullanıcı atlamalar veya geriye dönmeler yapmak isteyebilir.

Metin,
UniqueIdentifier olmasi, primary key'i gereksiz kilmiyor. UniqueIdentifier sadece data tipi, yaratildiktan sonra ayni kolonda essiz olmasinin garantisi yok (eger primary key, unique gibi bir constraint kullanmazsan). Mesela 'child' tablolarda foreign key olarak kullanilan kolon da uniqueidentifier.

Ben myGUID'i uniqueIdentiifer ve Primary key yapardim:) Kullanicinin girebilecegi degerlerin PK olmasina karsiyim. SipNo gibi degerler clustered index ve Unique olabilir ama Primary Key olmasina serh koyuyorum:)

18

Re: Cursor Adapter Hk.

cetinbasoz yazdı:

Soykan,
Olmazsa olmaz maddeleri 1 ve 2 benim verdiklerim ile ilgili degil sanirim. Bende oyle bir kisitlama yok, hatta tersi tesvik ediliyor:)

sonucta class larin basarili olarak calisabilmesi icin tablolarin DE de olmasi gerekmiyormu ? ayrica tablo ve field adlari ayni olmak zorunda degilmi VFP ve SQL tarafında?

1 ve 2 de bunlari anlatmaya calistim tersi olabiliyorsa bu arada öğrenmis olurum smile

19

Re: Cursor Adapter Hk.

Gerekmiyor.

with SQLOpenTable('Customer')
  ...
endwith

SQLInsert( ... )

SQLNonQuery( ... )

with SQLQuery( m.lcSQL )
...
endwith

2) Iki tarafta da olmak zorunda degil demek istedigim. Belki sadece SQL server bazli bir projedir:)

20 Son düzenleyen, cetinbasoz (08.02.2010 17:38:10)

Re: Cursor Adapter Hk.

Jenerik ornek:

Visual Fox Pro
Local loCursor, lcConStr

*!*    lcConStr = 'Driver={SQL Native Client};Trusted_connection=Yes;Server=.'
*!*    loCursor = Newobject('CaGeneric','cageneric.prg','','ODBC',m.lcConStr)
 
lcConStr = 'Provider=SQLNCLI;Trusted_connection=Yes;Server=.\SQLExpress'
loCursor = Newobject('CaGeneric','','','ADO',m.lcConStr)
 
With loCursor
  .Alias          = 'myTable'
  TEXT TO .SelectCmd  noshow
SELECT * FROM NorthWind..Customers cus WHERE country = ?m.Country
  ENDTEXT
ENDWITH
 
Country = 'USA'
If loCursor.QueryFill()
  Select (loCursor.Alias)
 
  loCursor.MakeUpdatable('NorthWind..Customers','customerId')
  Browse Last
  Tableupdate(2,.T.,loCursor.Alias)
Endif
 
 
Country = 'UK'
If loCursor.QueryFill()
  Select (loCursor.Alias)
 
  loCursor.MakeUpdatable('NorthWind..Customers','customerId')
  Browse Last
  Tableupdate(2,.T.,loCursor.Alias)
Endif
 
 
Define Class CaGeneric As CursorAdapter
  CompareMemo = .F.
  FetchAsNeeded = .T.
  FetchSize = 100
  FetchMemo = .T.
  BatchUpdateCount = 100
  WhereType = 1
  AllowSimultaneousFetch = .T.
  MapVarchar = .T.
  MapBinary = .T.
  BufferModeOverride = 5
  *!*      *  Nodata = .T.
  Handle = 0
 
  Procedure AutoOpen
    If Not Pemstatus(This, '__VFPSetup', 5)
      This.AddProperty('__VFPSetup', 1)
      This.Init()
    Endif
  Endproc
 
  Procedure Init(tcType,tcConnectionString)
    Local llReturn
    Do Case
      Case Not Pemstatus(This, '__VFPSetup', 5)
        This.AddProperty('__VFPSetup', 0)
      Case This.__VFPSetup = 1
        This.__VFPSetup = 2
      Case This.__VFPSetup = 2
        This.__VFPSetup = 0
        Return
    Endcase
    Set Multilocks On
    llReturn = DoDefault()
 
    This.DataSourceType = m.tcType
 
    Store This.DataSourceType To ;
      this.InsertCmdDataSourceType, ;
      this.UpdateCmdDataSourceType, ;
      this.DeleteCmdDataSourceType
 
    ***<DataSource>
    Do Case
      Case Upper(This.DataSourceType) == "ODBC"
        This.Handle = Sqlstringconnect(m.tcConnectionString)
 
        Store This.Handle To ;
          This.Datasource,;
          This.InsertCmdDataSource,;
          This.UpdateCmdDataSource,;
          This.DeleteCmdDataSource
 
      Case Upper(This.DataSourceType) == "ADO"
        Local loConnDataSource
        loConnDataSource = Createobject('ADODB.Connection')
        ***<DataSource>
        loConnDataSource.ConnectionString = m.tcConnectionString
        ***</DataSource>
        loConnDataSource.Open()
        This.Datasource = Createobject('ADODB.RecordSet')
        This.Datasource.CursorLocation   = 3  && adUseClient
        This.Datasource.LockType         = 3  && adLockOptimistic
        This.Datasource.ActiveConnection = loConnDataSource
        *** End of Select connection code: DO NOT REMOVE
 
        loCommand = Createobject('ADODB.Command')
        loCommand.ActiveConnection = loConnDataSource
        This.AddProperty('oCommand',loCommand)
        This.UpdateCmdDataSource=loCommand
        This.InsertCmdDataSource=loCommand
        This.DeleteCmdDataSource=loCommand
 
      Case Upper(This.DataSourceType)="NATIVE" && Not implemented
      Case Upper(This.DataSourceType)="XML"  && Not implemented
    Endcase
    ***</DataSource>
 
    If This.__VFPSetup = 1
      This.__VFPSetup = 2
    Endif
    Return llReturn
  Endproc
 
  Procedure MakeUpdatable(tcTableName,tckeyField,tlDoNotIncludeKey)
    This.Tables = m.tcTableName
    This.KeyFieldList = m.tckeyField
    Local ix, lnUpdateableFCount
    lnUpdateableFCount = Fcount(This.Alias)-Iif(This.DataSourceType='ADO',1,0) && last one is ADOBOOKMARK
    For ix = 1 To m.lnUpdateableFCount
      If !m.tlDoNotIncludeKey Or !(Upper(Field(m.ix,This.Alias,0)) == Upper(m.tckeyField))
        This.UpdatableFieldList = This.UpdatableFieldList + ;
          IIF(Empty(This.UpdatableFieldList),'',',') + ;
          FIELD(m.ix,This.Alias,0)
      Endif
      This.UpdateNameList = This.UpdateNameList + ;
        IIF(Empty(This.UpdateNameList),'',',') + ;
        TEXTMERGE('<<FIELD(m.ix,this.Alias,0)>> <<m.tcTableName>>.<<FIELD(m.ix,this.Alias,0)>>')
    Endfor
  Endproc
 
  Procedure QueryFill()
    Local llSuccess
    If This.DataSourceType ="ADO"
      llSuccess = This.CursorFill(.F.,.F.,0,This.oCommand)
    Else
      llSuccess = This.CursorFill(.F.)
    Endif
    If !m.llSuccess
        If This.DataSourceType ="ADO"
            lcMessage = This.oCommand.CommandText + CHR(13) + This.GetErrorExplanation()
        ELSE
            lcMessage = This.GetErrorExplanation()
        endif   
      Messagebox(m.lcMessage)
    Endif
    Return m.llSuccess
  Endproc
 
  Procedure GetErrorExplanation
    Local lcError,ix
    Local Array aWhy[1]
    Aerror(aWhy)
    lcError = ""
    For ix = 1 To 7
      lcError = m.lcError + Transform(aWhy[m.ix]) + Chr(13)
    Endfor
    Return m.lcError
  Endproc
Enddefine

21

Re: Cursor Adapter Hk.

2- icin sadece SQL tarafli olacaksa evet dogru

1-
SQLInsert( ... )

SQLNonQuery( ... )

with SQLQuery( m.lcSQL )
...
endwith

bunları biliyorum uygulamanin herhangi bir yerinde kullanabiliyoruz

with SQLOpenTable(addbs(m.mypath)+'Customer')
  ...
endwith

i form load da kullanmamiz DE de kullandigimizla ayni sonuca goturuyorsa bizi okey ama bu yine bana sadece SQL tarafli oldugu zaman icin cozum gibi geldi yoksa yanlis mi anladim.

22

Re: Cursor Adapter Hk.

Yanlis anlamissin. SQLOpenTable()'da path yok.

23

Re: Cursor Adapter Hk.

cetinbasoz yazdı:


Metin,
UniqueIdentifier olmasi, primary key'i gereksiz kilmiyor. ...

her seferinde newid ile değer aldığında aynı değerin tekrar oluşmasının imkansız farzedildiğini sen söylemiştin. ben ordan yola çıkarak gereksiz dedim.

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

24

Re: Cursor Adapter Hk.

soykanozcelik yazdı:

...
sipnolar konusunda aslinda o sipno degilde sipislemno olsa daha iyi olurdu smile siparis dedigin gibi char daha mantikli .
sipislemno identity yerine sequantil olabilecek sen ne onerirsin?

ben o tür bir alanı primary key veya unique yaparım. karakteri alıp nümeriğe çevirip bir arttırıp tekrar karaktere çeviriyorum. başında harfler varsa o harfleri bozmadan tabii. kaydı eklemeye çalışıyorum. eğer ekleyemezsem demek ki başkası benden önce davranmış. bir daha arttırıyorum.

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

25

Re: Cursor Adapter Hk.

ozaman SQL tarafli oluyor bu cozum smile  ben vfp+sql olarakta kullanilabilmesi icin olmazsa olmazlar listesine dahil etmistim