Konu: tablodan tabloya veri atmak
2 tablom var şimdi bir tabloda fbno hanesi dolu diğerinde boş ikisindede sskno dolu ben fbnoları boş olana nasıl gönderirim sskno karşılıklı olacak şekilde
butona basınca
Giriş yapmadınız. Lütfen giriş yapın yada kayıt olun.
fox4um » Kodlama ve Komutlar » tablodan tabloya veri atmak
2 tablom var şimdi bir tabloda fbno hanesi dolu diğerinde boş ikisindede sskno dolu ben fbnoları boş olana nasıl gönderirim sskno karşılıklı olacak şekilde
butona basınca
repl syedek.fbno with verifbno in "syedek"
bu kodda data type mismatch hatası veriyor nedenkine
buldum fbnoyu yazdırmayı denedim ancak bu sefer şöyle bir sorun var attığı fbnoların hepsi 0 ve birde sonsuz döngüye girdi anlayamadım
Söyle bir program yazsan ;
select tablo2 &&fbno bos olan tablo
set order to sskno
Select tablo1 &&fbno dolu olan tablo
Go Top
Do While !eof()
d_sskno =sskno
d_fbno = fbno
select tablo2
if seek(d_sskno)
select tablo1
replace fbno with d_fbno
endif
select tablo1
skip
enddo
bu kod atmadı neden bilmiyorum ama
select syedek &&fbno bos olan tablo
set order to sskno
Select personel &&fbno dolu olan tablo
Go Top
Do While !eof()
d_sskno =personel.sskno
d_fbno = personel.fbno &&bu iki satırda hangi dataya ait olduğunu belirtmem doğru olmazmı
select personel
if seek(STR(d_sskno)) &&böyle yapmadan data type mismatch hatası verdi alltrim denedim olmadı
select syedek
replace syedek.fbno with d_fbno
endif
select syedek
skip
enddo
ben böyle bir kod yazdım olmazmı
SELE personel
SET order to sskno
SELECT CNT(*) from personel into array sayim
FOR sayici=1 to sayim
SELE personel
SET order to sskno
GO m.sayici
arama=personel.sskno
verfbno=personel.fbno
SELE syedek
SET order to sskno
SELECT CNT(*) from syedek into array sayper
FOR sayiper=1 to sayper
SELE syedek
SET order to sskno
GO m.sayiper
IF arama=syedek.sskno
REPL syedek.fbno WITH verfbno IN "SYEDEK"
=tableupdate(1,.t.,"syedek")
ENDIF
IF sayiper=sayper
EXIT
ENDIF
NEXT
IF sayici=sayim
EXIT
ENDIF
NEXT
ama bu öyle zaman alıyorki
yaklaşık 4 - 5 dakika
birde şöyle bir sorunum var programın içerisinde
use syedek
dele all
diye yazdım ancak kayıtlar hala var exclusive on
program içinde pack nasıl yaptırrırım yada o kayıtlar nasıl gider
yani syedek her bilgi girişinden önce boşalacak sonra bilgiler yazılacak ancak kayıtlar birike birike dosya büyüdü.
dosyayı pack ile küçülürken exclusive açmak için programın main bölümüne veya formun dataenviroment.beforeopentables ine koyulacak
*IF DAY(DATE())%5=0 && 5 günde bir yapsın
Xftp=SYS(5)+SYS(2003)+'\irsdata\irsdata1\işlemler.fpt' &&pack edilecek dosya
=ADIR(geçici,Xftp)
IF geçici[1,2]>5000000 && veya 5 MB büyükse yapsın
Xdbf=SYS(5)+SYS(2003)+'\irsdata\irsdata1\işlemler.dbf' &&pack edilecek dosya
hFile = FOPEN(Xdbf, 12) && KONTROL ET
IF (hFile > 0) && Not used
FCLOSE(hFile)
USE (Xdbf) EXCL
PACK
USE
ENDI
ENDI
sevgili moderom, gücenme ama soru sorarken biraz daha özen göstermek gerekiyor galiba, sorunu yanıtlar arasında anlamayı bile tam olarak becerebildiğim şüpheli..
dosyaların herhangi biri ortak alan ssk üzerinden indeksli ise:
sele dosya1
set rela to dosya2 into ssk IN dosya1
scan
repl dosya2.xAlan with dosya1.xAlan IN dosya2
repl dosya1.yAlan with dosya2.yAlan IN dosya1
ends
veya
SELE ..., dosya1.yAlan, dosya2.xAlan, ... ;
FROM dosya1 LEFT JOIN dosya2 ON dosya1.ssk=dosya2.ssk;
INTO DBF yenidosya
sürenin milyon kayıt için saniyeler ile ölçüleceğini düşünüyorum
Ben daha kısa bir yol söyliyim :
UPDATE Syedek ;
SET syedek.fbno = personel.fbno ;
From Syedek ;
Join Personel On Syedek.SSKNo == Personel.SSKNo
Eğer fbno tipleri farklı ise ( INT ve String olduğunu varsayalım )
UPDATE Syedek ;
SET syedek.fbno = CAST(personel.fbno As Int)) ;
From Syedek ;
Join Personel On Syedek.SSKNo == Personel.SSKNo
Bence bir şekilde VFP9 a geçmelisin .... VFP6 da yukarıdaki update komutları çalışmaz.
bu kod atmadı neden bilmiyorum ama
Visual Fox Proselect syedek &&fbno bos olan tablo
set order to sskno
Select personel &&fbno dolu olan tablo
Go Top
Do While !eof()
d_sskno =personel.sskno
d_fbno = personel.fbno &&bu iki satırda hangi dataya ait olduğunu belirtmem doğru olmazmı
select personel
if seek(STR(d_sskno)) &&böyle yapmadan data type mismatch hatası verdi alltrim denedim olmadı
select syedek
replace syedek.fbno with d_fbno
endif
select syedek
skip
enddo
Her iki tablodaki sskno alan tiplerin farklı oldğu için bu hatayı almışsın. Burada hata verdiğine göre personel tablosundaki sskno alanı int veya numeric, syedek tablosunda ise muhtemelen charecter ... Bunların aynı alan tipi olması gerekiyor.
Birde Select personel ile tabloyu seçtikten sonra oradaki bir alanı değişkene aktarmak için d_sskno = personel.sskno demene gerek yok d_sskno=sskno yeterli olur.
Şimdi iki data tablom var birisi
personel
diğeri ise
syedek
ikisindede indekste sskno fbno seçili
sonra ikisindede sskno alanı numeric 13 fbno numeric 5
ayarladım
EĞER HİÇ KAYIT YOKSA
UPDATE SIGORTA2 ;
SET SIGORTA2.fbno = SYEDEK.fbno ,;
SET SIGORTA2.SSKNO = SYEDEK.SSKNO ,;
SET SIGORTA2.YIL = SYEDEK.YIL ,;
SET SIGORTA2.GUN01 = SYEDEK.GUN ,;
SET SIGORTA2.UCR01 = SYEDEK.UCRET ,;
SET SIGORTA2.IKR01 = SYEDEK.IKRAMIYE ;
From SIGORTA2 ;
Join SYEDEK
VARSA
UPDATE SIGORTA2 ;
SET SIGORTA2.fbno = SYEDEK.fbno ,;
SET SIGORTA2.SSKNO = SYEDEK.SSKNO ,;
SET SIGORTA2.YIL = SYEDEK.YIL ,;
SET SIGORTA2.GUN01 = SYEDEK.GUN +SIGORTA2.GUN01,;
SET SIGORTA2.UCR01 = SYEDEK.UCRET +SIGORTA2.UCR01,;
SET SIGORTA2.IKR01 = SYEDEK.IKRAMIYE+SIGORTA2.IKR01 ;
From SIGORTA2 ;
Join SYEDEK ON SIGORTA2.SSKNO==SYEDEK.SSKNO AND SIGORTA2.YIL==SYEDEK.YIL
BU KOD NEDEN HATA VERİYOR. 1. UPDATE DE
LEFT JOIN ON dosya1.ortakalan = dosya2.ortakalan
2. tablo ile 1e1 değil ise bazı 2. tablo değerleri null döner, 1. tablo nulları kabul ediyor mu ?
o dediğim olayı uğur beyin
UPDATE Syedek ;
SET syedek.fbno = CAST(personel.fbno As Int)) ;
From Syedek ;
Join Personel On Syedek.SSKNo == Personel.SSKNo
kodu ile hallettim
bu ayrı
EĞER HİÇ KAYIT YOKSA
UPDATE SIGORTA2 ;
SET SIGORTA2.fbno = SYEDEK.fbno ,;
SET SIGORTA2.SSKNO = SYEDEK.SSKNO ,;
SET SIGORTA2.YIL = SYEDEK.YIL ,;
SET SIGORTA2.GUN01 = SYEDEK.GUN ,;
SET SIGORTA2.UCR01 = SYEDEK.UCRET ,;
SET SIGORTA2.IKR01 = SYEDEK.IKRAMIYE ;
From SIGORTA2 ;
Join SYEDEK
VARSA
UPDATE SIGORTA2 ;
SET SIGORTA2.fbno = SYEDEK.fbno ,;
SET SIGORTA2.SSKNO = SYEDEK.SSKNO ,;
SET SIGORTA2.YIL = SYEDEK.YIL ,;
SET SIGORTA2.GUN01 = SYEDEK.GUN +SIGORTA2.GUN01,;
SET SIGORTA2.UCR01 = SYEDEK.UCRET +SIGORTA2.UCR01,;
SET SIGORTA2.IKR01 = SYEDEK.IKRAMIYE+SIGORTA2.IKR01 ;
From SIGORTA2 ;
Join SYEDEK ON SIGORTA2.SSKNO==SYEDEK.SSKNO AND SIGORTA2.YIL==SYEDEK.YIL
BU KOD NEDEN HATA VERİYOR. 1. UPDATE DE
Moderom;
Hiç kayıt yoksa neden güncelleme yapıyorsun ki? Anlamadım
UPDATE SIGORTA2 ;
SET SIGORTA2.fbno = SYEDEK.fbno ,;
SET SIGORTA2.SSKNO = SYEDEK.SSKNO ,;
SET SIGORTA2.YIL = SYEDEK.YIL ,;
SET SIGORTA2.GUN01 = SYEDEK.GUN ,;
SET SIGORTA2.UCR01 = SYEDEK.UCRET ,;
SET SIGORTA2.IKR01 = SYEDEK.IKRAMIYE ;
From SIGORTA2 ;
Join SYEDEK && Eğer join belirttiysen; koşulda belirtmek zorundasın.
nasıl yapıcam ozaman.
direk nasıl yüklerim ordan oraya
ikinci komutta join belirttiğim yerde and kullanım şeklim doğrumu.
peki vfp6 da hangi komutları kullanırım evime 9 temin ettim üniversitenin programcılarından aldım ancak işyerimde bilgisayarlara dıştan program kurulmuyor....
Anladığım kadarı ile hiç kayıt yok ise bununlar syedek deki kayıtları sigorta2 (2 table alanlari birbirinin ayni ise) ye aktarabilirsin.
Insert Into SIGORTA2 Select * From SYEDEK
evet yapmak istediğim bu peki burada koşul koyabilirmiyim mesela syedek içerisindeki ssknumaralarının personel tablosunda olma koşulu ozaman
Insert Into SIGORTA2 Select * From SYEDEK where syedek.sskno= personel.sskno
mu diyeceğim
yoksa
Insert Into SIGORTA2 Select * From SYEDEK where syedek.sskno= personel.sskno
birde kayıtları atarken tablodaki istediğim alanı istediğim yere atacağım
örnek
syedek tablo alanları //// sskno * fbno * yil * gun * ucret * ikramiye
personelde //// sskno * fbno
sigorta2 //// sskno * fbno * yil *gun01 * ucr01 * ikr01
bu dosyayı nasıl aktarırım oraya sigorta2 ye girecek her türlü kayıt yeni olsun yani personel boş olsada olmasada personelde olup olmadığı kontrol edilecek
personelde varsa ilgili ssknosuna ait daha öncede o yılda işlem varmı yani yil haneside atılmak istenene eşitmi kontrol edecek
eğer oda varsa o yili kaydının o ayina kaydi yazacak.
mrduyar bey birde facede sizi gördüm galiba ama denk gelmedi konuşmak nasip olmadı bir ara konuşalım. ben vfp de yeniyim...
Moderom koşul koyabilirsin ama yazdığın şekilde değil. Join + Where i birlikte kullanman lazım. Biraz SQL çalışmalısın ...
http://rapidshare.com/files/443239087/S … lgiler.zip
projenin her yerinde kullanılabilecek bir değişken nasıl tanımlanır.onun değerine göre işlemler yapmak istiyorum
mrduyar bey birde facede sizi gördüm galiba ama denk gelmedi konuşmak nasip olmadı bir ara konuşalım. ben vfp de yeniyim...
Telefonum sende var aramanı bekliyorum. Telefonunu mail ile gönder arayayım.
telefon facede yazıyormu... işyerinde tel yasak ancak evden
fox4um » Kodlama ve Komutlar » tablodan tabloya veri atmak