1

Konu: Excele Aktarırken Tarih Formatı

değerli üstadlar;

bir tane tablo var mesela adı ornek olsun. pid, olay, tarih, isim, il ve bilgi de alanları olsun. burada tarih alanı date, bilgi alanı ise memo.
bir tane de form var, kullanıcı bu formdan istediği kriterleri seçiyor, daha sonra butona bastığında veriler excele gönderiliyor. Herhalde Soykan Hocamın foruma vermiş olduğu kodu da kullanarak diğer verileri (tarih ve memo hariç) filtreleyip excele atabiliyorum. Aşağıdaki kodda c1 kullanıcının seçim yaptığı combolardan birisi

Visual Fox Pro
select ornek

sorgula="PID>=1"
if .not.alltrim(thisform.c1.value)==""
sorgula=sorgula+".AND.isim=ALLTRIM(thisform.c1.value).AND.olay=ALLTRIM('falan')"
endif
if .not.alltrim(thisform.c2.value)==""
sorgula=sorgula+".AND.il=ALLTRIM(thisform.c2.value).AND.olay=ALLTRIM('falan')"
endif
select ornek
rr=recno()
set filter to &sorgula
 
set safety off
local oexcel
copy to sys(5)+curdir()+[deneme] type xls
oexcel=createobject("excel.application")
oexcel.application.screenupdating = .f.
oexcel.workbooks.open(sys(5)+curdir()+[deneme])
oexcel.visible=.t.
oexcel.range("a1").select && basliklar a1 de kabul ediyoruz
*oExcel.Range(Cells(1, 1), Cells(1, FCount())).Select
oexcel.selection.autofilter && selectiona gore otomatik filtre yapildi
oexcel.columns().autofit && kolonlar otomatik olarak boyutlandırıldı
oexcel.range("a2").select && a2 de konumlan
oexcel.application.screenupdating = .t.
oexcel=.null.

dolayısıyla bu kodla ismi c1'de seçilen ve ili de c'de seçilen veriyi excele atabiliyorum. Ancak işin içine tarihi de katınca hata veriyor. tarihi de katmak için kodu şöyle denedim:

Visual Fox Pro
select ornek

sorgula="PID>=1"
if .not.alltrim(thisform.c1.value)==""
sorgula=sorgula+".AND.isim=ALLTRIM(thisform.c1.value).AND.olay=ALLTRIM('falan').and. ;
tarih between thisform.t1.value and thisform.t2.value"

endif

kodun başı ve sonu aynı, çalıştırınca data type ile ilgili bir hata veriyor, suspend deyince "set filter to &sorgula" satırını işaretliyor. Bu arada, formdaki t1 ve t2 alanlarının formatı {}, ornek tablosunda tarihler 16/10/09 gibi görünüyor. bir de bu tablodan excele attığım başka tarihlerde 16-Oct-09 diye çıkıyor niye onu da anlamadım. Ben galiba hiçbirşeyi anlamıyorum smile
Bir de memo alanlarını excele atabiliyor muyuz?

mutlu hafta sonları dilerim..

2

Re: Excele Aktarırken Tarih Formatı

komutlar arasinda bosluk yok tu asagidaki gibi denermisin

Visual Fox Pro
sorgula=" PID>=1 "

sorgula=sorgula + " .AND. isim=ALLTRIM(thisform.c1.value) .AND. olay=ALLTRIM('falan') "

3

Re: Excele Aktarırken Tarih Formatı

Copy to XLS  komutunu unutmakla basla. Onu hic gormedin, VFP'ye yanlislikla eklenmis diye dusun.

Bu sekilde memo dahil yapabilirsin:

Visual Fox Pro
p1 = ALLTRIM(thisform.c1.value)+'%'

p2 = ALLTRIM(thisform.c2.value)+'%'
t1 = Thisform.t1.Value
t2 = Thisform.t2.Value
Select * From Ornek ;
  WHERE ;
  PID >= 1 And ;
  olay='falan' And ;
  isim Like ?m.p1 And ;
  il Like ?m.p2 And ;
  tarih Between ?m.t1 And ?m.t2 ;
  Into Cursor crsExcel nofilter
 
Local oExcel
oExcel = Createobject("Excel.Application")
With oExcel
  .DisplayAlerts = .F.
  .Workbooks.Add
  .Visible = .T.
  With .ActiveWorkBook
    VFP2Excel('crsExcel', .WorkSheets(1).Range("A1"), "" ) && sheet1, A1, baslik field adlari
    .WorkSheets(1).Activate
  Endwith
Endwith
 
* Warning:
* Copying to a free table (might be dbc based)
* temporarily and using field names as headers
* if not passed.
* This might lead to problems like:
* Truncated fieldnames of 2 columns collide and copy to errors
* Field names might be cryptic for the enduser
Function VFP2Excel
  Lparameters tcCursorName, toRange, tcHeaders
  tcCursorName = Iif(Empty(m.tcCursorName),Alias(),m.tcCursorName)
  Local loConn As AdoDB.Connection, loRS As AdoDB.Recordset,;
    lcTemp, oExcel,ix
 
  lcTemp = Forcepath(Sys(2015)+'.dbf',Sys(2023))
  Select (m.tcCursorName)
  Copy To (m.lcTemp)
  loConn = Createobject("Adodb.connection")
  loConn.ConnectionString = "Provider=VFPOLEDB;Data Source="+Sys(2023)
  loConn.Open()
  loRS = loConn.Execute("select * from "+m.lcTemp)
 
  * Use first row for headers
  Local Array aHeader[1]
 
  toRange.Offset(1,0).CopyFromRecordSet( loRS )  && Copy data starting from headerrow + 1
  For ix=1 To Iif( !Empty(m.tcHeaders), ;
      ALINES(aHeader, m.tcHeaders,1,','), ;
      loRS.Fields.Count )
    toRange.Offset(0,m.ix-1).Value = ;
      Iif( !Empty(m.tcHeaders), ;
      aHeader[m.ix], ;
      Proper(loRS.Fields(m.ix-1).Name) )
    toRange.Offset(0,m.ix-1).Font.Bold = .T.
  Endfor
 
  loRS.Close
  loConn.Close
  Erase (m.lcTemp)
Endfunc

4 Son düzenleyen, mrduyar (16.10.2009 14:26:02)

Re: Excele Aktarırken Tarih Formatı

Tarih için xl5 dene.

Visual Fox Pro
Function CursorToExcel

Lparameters LcCursor
Local dosyaadi,oexcel
dosyaadi = Sys(2023)+ "\" + Sys(3)
Select(LcCursor)
Export To &dosyaadi Type Xl5
oexcel = Createobject('Excel.Application')
oexcel.workbooks.Open(dosyaadi)
oexcel.Visible = .T.
lows = oexcel.worksheets(1)
Endfunc

çetin hocam

cetinbasoz yazdı:

Copy to XLS  komutunu unutmakla basla. Onu hic gormedin, VFP'ye yanlislikla eklenmis diye dusun.


export to içinde geçerlimi acaba

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

5

Re: Excele Aktarırken Tarih Formatı

XL5'i de unut, hatta XL8'i de. Import/Export komutlarini da unut. Onlar yok, gormediniz, Yok gordum ben diyen kullansin (kendi dusen aglamaz).

6

Re: Excele Aktarırken Tarih Formatı

Bu gün çok yavaşım cumadan olsa gerek.

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

7

Re: Excele Aktarırken Tarih Formatı

Çetin Hocam,
kod için çok teşekkür ederim, ancak şöyle bir durum var:
formu çalıştırıp tarih aralığını girdikten sonra excele doğru olarak aktarıyor, ancak exceli kapatıp form üzerinden tarihi değiştirip tekrar çalıştırınca Vfp2Excel'deki

Visual Fox Pro
toRange.Offset(1,0).CopyFromRecordSet( loRS )  && Copy data starting from headerrow + 1


satırı hata veriyor, mesaj şu:
ole error code 0x80004005:Belirtilmemiş hata
ignore der geçersek arka planda doğru olarak datayı excele atıyor, cancel dersek datayı yine de atıyor ancak excelde sütün etiketleri çıkmıyor?

8

Re: Excele Aktarırken Tarih Formatı

http://www.fox4um.com/topic/1327/tablod … kopyalama/

VFP9 SP2

9

Re: Excele Aktarırken Tarih Formatı

cetinbasoz yazdı:

XL5'i de unut, hatta XL8'i de. Import/Export komutlarini da unut. Onlar yok, gormediniz, Yok gordum ben diyen kullansin (kendi dusen aglamaz).

peki bu kodda save nasıl olacak? onu vermemişsin...

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

10

Re: Excele Aktarırken Tarih Formatı

Save'den kolay ne var Allah askina.

SaveAs( ... )

11

Re: Excele Aktarırken Tarih Formatı

iyi ama saveas yok. sadece save var o da protected. zaten protected olmasa da beceremezdim çünkü variant türü.
o yüzden sormuştum.

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

12 Son düzenleyen, cetinbasoz (20.10.2009 13:19:21)

Re: Excele Aktarırken Tarih Formatı

Allah Allah,
hangi versiyonu excelin? Hepsinde saveas var bildigim:

Visual Fox Pro
oExcel = Createobject("Excel.Application")

*...
With oExcel
  .DisplayAlerts = .F.
  .Workbooks.Add
  .Visible = .T.
  With .ActiveWorkBook
    VFP2Excel('crsExcel', .WorkSheets(1).Range("A1"), "" ) && sheet1, A1, baslik field adlari
    .WorkSheets(1).Activate
#define xlWorkbookNormal                                  -4143
   .SaveAs("c:\Temp\Metin.xls", xlWorkBookNormal)
   .Saved = .T.
 
  Endwith
   * Istersen kapa - o zaman sanirim yukaridaki visible ve activate'i istemeyeceksin
   *.ActiveWorkbook.Close
   .Quit
Endwith
*...

13

Re: Excele Aktarırken Tarih Formatı

.WorkSheets(1).Activate
satırının altına
.saveas('c:\prg\test.xls')
olarak yazınca saklıyor.

14

Re: Excele Aktarırken Tarih Formatı

ben direk oexcel nesnesinde saveas aradım. şimdi oldu. teşekkürler...

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

15

Re: Excele Aktarırken Tarih Formatı

Çetin abi,
Excel aktarımı süper ancak başlıkların max 10 karekterini alıyor. Nasıl düzeltilebilir?

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

16 Son düzenleyen, metin (23.10.2009 09:48:08)

Re: Excele Aktarırken Tarih Formatı

hiç bakmadım ama sanırım ado bağlantısı ilk 10 karakteri alıyor. zaten 10 karakterden fazlası database dışında da desteklenmiyor.
denemedim ama bu işini görebilir:


Visual Fox Pro
...

AFields(xxx)
For ix=1 To Iif( !Empty(m.tcHeaders), ;
      ALINES(aHeader, m.tcHeaders,1,','), ;
      loRS.Fields.Count )
toRange.Offset(0,m.ix-1).Value = ;
      Iif( !Empty(m.tcHeaders), ;
      aHeader[m.ix], ;
      Field(Ascan(xxx,Proper(loRS.Fields(m.ix-1).Name,1,Alen(xxx,1),1,8))) )
...

ben şahsen 10 karakterden fazlasını hiçbir zaman kullanmazdım. tedbirli olmak iyidir. mesela foxpro bir ara türkçe harflerden değişkenleri de kabul ediyordu. hiç kullanmadım.

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

17

Re: Excele Aktarırken Tarih Formatı

Visual Fox Pro
Field(Ascan(xxx,Proper(loRS.Fields(m.ix-1).Name,1,Alen(xxx,1),1,8))) )


Satırında; Too many arguments mesajı veriyor.

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

18 Son düzenleyen, metin (23.10.2009 14:17:37)

Re: Excele Aktarırken Tarih Formatı

sadece parantez hatası. düzeltilmiş hali:

Visual Fox Pro
Field(Ascan(xxx,Upper(Proper(loRS.Fields(m.ix-1).Name)),1,Alen(xxx,1),1,8)))

yani biraz ders vermek gibi olmasın ama kendini geliştirmek ve hazıra alışmamak için biraz çaba harcamalısın.

bu arada türkçe harfe benzer olan fieldlarda upper gerekiyor. bunu ekledim az önce

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

19

Re: Excele Aktarırken Tarih Formatı

Visual Fox Pro
Function VFP2Excel

Lparameters tccursorname, toRange, tcHeaders
tccursorname = Iif(Empty(m.tccursorname),Alias(),m.tccursorname)
Local loConn As AdoDB.Connection, loRS As AdoDB.Recordset,;
    lcTemp, oexcel,ix
 
lcTemp = Forcepath(Sys(2015)+'.dbf',Sys(2023))
Select (m.tccursorname)
Copy To (m.lcTemp)
loConn = Createobject("Adodb.connection")
loConn.ConnectionString = "Provider=VFPOLEDB;Data Source="+Sys(2023)
loConn.Open()
loRS = loConn.Execute("select * from "+m.lcTemp)
* Use first row for headers
Local Array aHeader[1]
toRange.Offset(1,0).CopyFromRecordSet( loRS )  && Copy data starting from headerrow + 1
Afields(aflds)
For ix=1 To Iif( !Empty(m.tcHeaders), ;
        ALINES(aHeader, m.tcHeaders,1,','), ;
        loRS.Fields.Count )
    toRange.Offset(0,m.ix-1).Value = Iif( !Empty(m.tcHeaders), ;
        aHeader[m.ix],  aflds(ix, 1))
    toRange.Offset(0,m.ix-1).Font.Bold = .T.
Endfor
loRS.Close
loConn.Close
Erase (m.lcTemp)
Endfunc

Haklısın. Ben zaten sorunu çözdüm ana hatayıda yazdım. Çünki senin kodunda ASCAN ile nasıl yapıldığını bilmiyordum. Onuda öğrenmiş oldum.

Sizlerden bu araştırma dışında tüm dersleri alabilirim.
İnan buraya bir şey yazmadan en az 30 dakika araştırıp yazıyor.

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