Konu: Foruma ornek data gondermek
Sorular bazen SQL iceriyor ve o SQL'i daha iyi anlayabilmek icin kendi makinenizde benzer datayi yaratmaniz gerekiyor. Soru sahibi gerekli cursorlari yaratip icini bir miktar data ile dolduracak kodu da gonderse ne guzel olurdu:) Bu kod burada devreye giriyor.
Bu daha once gonderdigim kodun biraz modifiye sekli ve daha rahat.
-Ornek data icin gerekli cursorlari yaratan ve icini dolduran kodu yazip clipboarda koyuyor
-Soru soran basitce Ctrl+V ile sorusuna ek olarak uretilen kodu yapistiriyor
Ornegin t1 ve t2 adinda iki cursor'unuz var ve "c:\my folder\myTable.dbf" tablonuz var. t1 ve t2'nin "tum" kayitlarini ve myTable.dbf'in 3 kaydini gondermek ve problemimi anlatmak istiyorum. O zaman soyle yapiyorum:
Command window:
SampleDataAsText("t1,0,t2,0,c:\my folder\myTable,3")
sonra forumdaki mesajima geli[ Ctrl+V ile yapistiriyorum:) O kadar. Artik forumdakilerin benimle ayni datayi gormek icin yapmalari gereken o kodu calisirmak.
Bu kod %100 her turlu data ve datatipiyle calisacak sekilde ayarlanmadi ama %98-99 is gorur. Her zaman rahatlikla ulasacaginiz bir yere saklayin (mesela VFP dizinine koyarsaniz:
do home()+'SampleDataAsText' with "t1,0,t2,0,c:\my folder\myTable,3"
seklinde kullanmak kolay olur. Kodu kullanarak cevap vermeye calisanlar icin de hayati kolaylastirdiginiz icin simdiden tesekkurler.
*!* *** Calling samples
*!* Set Textmerge Delimiters To '%%','%%'
*!* TEXT TO cSampleDataAsText TEXTMERGE noshow
*!* myCursor1,0
*!* myCursor2,0
*!* MyCursor3,10
*!* <<_samples+'data\Customer'>>,3
*!* <<_samples+'data\Employee'>>,5
*!* ENDTEXT
*!* sampleDataAsText(m.cSampleDataAsText)
*!* SampleDataAsText( ;
*!* 'myCursor1,0,'+;
*!* 'myCursor2,0,'+;
*!* 'myCursor3,10,'+;
*!* _samples+'data\Customer,3,'+;
*!* _samples+'data\Employee,5' )
*!* *** Calling is in pairs.
*!* **First one is an alias of open cursor/table
*!* **second specifies how many records to copy - 0 means all
* SampleDataAsText.prg
Lparameters tcInfo
LOCAL loCloseTemp, ix
loCloseTemp = CREATEOBJECT('CloseTemp')
LOCAL ARRAY laInfo[1]
Create Cursor crsSampler (procedureName m, procedureCode m)
For ix = 1 To ALINES(laInfo,m.tcInfo,1+4,',',CHR(13),CHR(10)) STEP 2
GetProcedureCode(laInfo[m.ix],VAL(laInfo[m.ix+1]))
Endfor
DataCreationCodeToClip()
MESSAGEBOX('Data creation is copied to clipboard',0,'Sample Data',3000)
Procedure DataCreationCodeToClip
Local Array aProcCode[1]
Local lcTemp1,lcTemp2
lcTemp1 = Sys(2015)+'.tmp'
lcTemp2 = Sys(2015)+'.tmp'
Select crsSampler
Scan
Strtofile(procedureName,m.lcTemp1,.T.)
Strtofile(procedureCode,m.lcTemp2,.T.)
Endscan
_Cliptext = Filetostr(m.lcTemp1) + Filetostr(m.lcTemp2)
Erase (m.lcTemp1)
Erase (m.lcTemp2)
Endproc
Procedure GetProcedureCode(tcAlias,tnRecords)
Local lcTemp, ix, lcData, lcRetVal
lcTemp = Sys(2015)+'.tmp'
If !Used(m.tcAlias)
Select * From (m.tcAlias) Into Cursor crsSampling nofilter
lcCursorName = Juststem(m.tcAlias)
Else
Select (m.tcAlias)
lcCursorName = Alias()
Endif
Locate
If Empty(m.tnRecords)
Copy To (m.lcTemp) Type Delimited
Else
Copy To (m.lcTemp) Type Delimited Next m.tnRecords
Endif
lcData = Filetostr(m.lcTemp)
Erase (m.lcTemp)
Set Textmerge Delimiters To '%%','%%'
Set Textmerge To (m.lcTemp) Noshow
Set Textmerge On
\
\ Procedure CreateCursor_%%m.lcCursorName%%
\ LOCAL lcData, lcTemp
\ lcTemp = SYS(2015)+'.tmp'
\ TEXT TO m.lcData noshow
\ %%m.lcData%%
\ ENDTEXT
\
\ STRTOFILE(m.lcData,m.lcTemp)
\
\ create CURSOR %%m.lcCursorName%% ;
\ ( ;
For ix=1 To Afields(aStruc)
\ %%IIF(m.ix > 1,',','')%%
\\%%aStruc[m.ix,1]%% %%aStruc[m.ix,2]%%(%%aStruc[m.ix,3]%%,%%aStruc[m.ix,4]%%)
\\ %%IIF(aStruc[m.ix,5],'',' NOT ')%% NULL
\\ %%IIF(aStruc[m.ix,6],'NOCPTRANS','')%% ;
Endfor
\ )
\
\ APPEND FROM (m.lcTemp) TYPE delimited
\ ERASE (m.lcTemp)
\ endproc
Set Textmerge To
Set Textmerge Off
Insert Into crsSampler Values ( Textmerge('CreateCursor_%%m.lcCursorName%%()%%CHR(13)+CHR(10)%%'), Filetostr(m.lcTemp) )
Set Textmerge Delimiters
Erase (m.lcTemp)
ENDPROC
** Class to close any cursors created after it was instantiated
** Author: Dragan Nedeljkovich
Define Class CloseTemp As Custom
Dimension a1[1]
nFiles=0
Procedure Init
This.nFiles=Aused(atemp)
If This.nFiles > 0
Acopy(atemp, This.a1)
Else
This.a1=""
Endif
endproc
Procedure Destroy
For i=1 To Aused(aNow)
If Ascan(This.a1, aNow[i,1],-1,-1,1,2+4)=0
Use In aNow[i,1]
Endif
Endfor
endproc
Enddefine