PDA

View Full Version : Tabela temporária e Mudar Localização do Crystal



HeitorArgenta
29-Aug-2023, 03:31 PM
Olá, eu uso DataFlex 17.0 e Crystal Reports XI.

Estou usando TempFile.pkg para criar tabelas temporárias na máquina do usuario:

Send Add_TempFile of ghoTempFileList TABELA1.File_number
Open (sCaminhoPadrao + "TABELA1") as TABELA1

Para processamentos demorados, no estilo abaixo, na máquina do usuário:

While ( Found )
Clear TABELA1
Reread
Move "P" to TABELA1.TIPO_INFO // TIPO PRESCRICAO PA
Move gsUsuario to TABELA1.USUARIO
Move CADPREPA.NR_PRESCRICAO to TABELA1.NR_PRESC_PA
Move CADPREPA.DATA to TABELA1.DATA_PA
Move CADPREPA.HORA to TABELA1.HORA_PA
Move sCADGER to TABELA1.CODPAC
SaveRecord TABELA1
Unlock
Constrained_Find Next
Loop

Até aí funcionou perfeitamente, abri o arquivo temporário no Database Explorer e mostra os registros corretos, testei tambem, usando um CopyFile, sobreescrever o DAT para mostrar no Crystal, só que isso torna o processo mais demorado ainda.

Estou tentando fazer com que o Crystal use o caminho da tabela temporária, só que ele usa o caminho da Workspace para procurar os registros e eu preciso alterar, testei assim:

Procedure OnInitializeReport Handle hoReport Integer eDestination
Handle hoDatabaseTable
String sDataPath sTable
Forward Send OnInitializeReport hoReport

//Set new data path.
Get GetTableObjectByName of hoReport "TABELA1" to hoDatabaseTable
Get ComLocation of hoDatabaseTable to sTable
Set ComLocation of hoDatabaseTable to (sCaminhoPadrao + sTable)
End_Procedure // OnInitializeReport

Na primeira execução, tudo funciona perfeitamente, só que na segunda, dá um erro de violação de arquivos e entra em modo de debbug, alguem pode me ajudar?

Samuel Pizarro
29-Aug-2023, 04:17 PM
provavelmente o relatorio ainda esta com o arquivo temporario aberto.

Sendo assim, a criacao do seu segundo "Add_TempFile" falha.. pois ele esta em uso.

Nao uso o crystal há decadas..

deve ter alguma coisa ai pra vc forçar a destruicao do relatorio, ou fechamento do mesmo para liberar o arquivo.


Voce pode comprovar a teoria , analisando que applicativos ou processos tem um handle aberto acessando seu aquivo.

Handle - Sysinternals | Microsoft Learn (https://learn.microsoft.com/pt-br/sysinternals/downloads/handle)


execute o relatorio uma primeira vez.. e depois de "fecha--lo" execute esse handle apontando pra seu .dat temporario. mto provavelmente ele vai mostrar que seu app esta mantendo o arquivo aberto.

HeitorArgenta
30-Aug-2023, 02:30 PM
Usando o handle cheguei a essa conclusão aí mesmo, estou a 2 horas já procurando como forçar a destruição/fechamento do relatório mas estou com certa dificuldade, se tu tiver alguma ideia ou dica que pudesse dizer agradeço, se não acho que vou postar em inglês mesmo, sei muito pouco sobre crystal kkkkk

Samuel Pizarro
31-Aug-2023, 10:50 AM
eu não sei Heitor.

Não uso mais o crystal ha mais de 15 anos.. Deve ter algum jeito. mas eu nao sei qual eh.

Uma vez que agora vc ja saba quel eh o problems sugiro perguntar no forum em ingles mesmo.. algo nesse sentido. como forcar o crystal report OCX em liberar a acesso ao .dat depois que o relatorio eh fechado.

Aliás, isso pode nem ser o bug do crystal em si.. mas um bug no driver da DAW , que o crystal usa pra conseguir ler os .dat. essa dll eh que opde estar segurando o .dat aberto e se o crystal pede pra fechar, e ela nao fecha.. nao ha nada que vc possa fazer.. mas isso eh so uma suposicao. nao estou dizendo que eh o que realmente esteja acontecendo, mas uma hipotese válida.
e se for isso, ai tu ta ferrado, pois a daw nao suporta mais esse ck ai pra crystal.

Em suma... boa sorte!

Queiroz
5-Sep-2023, 11:45 AM
Olá,

Eu uso há muito tempo este procedimento


Send Zerofile_TMP "Auxreceb" Auxreceb.File_Number



//***
//*** Procedimentos para criacao de arquivos temporarios
//***
Procedure Zerofile_Tmp String sFileName Integer hFile
Integer iNovoArq iFlag
String sTmpArq sLine
//***
String sSessionName sHomePath

Get_Environment 'SessionName' to sSessionName
Get_Environment 'HomePath' to sHomePath
Get_Environment 'TEMP' to sHomePath


Close hFile
Open hFile


// If (sSessionName Contains 'RDP') Begin
// If (Trim(sHomePath)>'') Begin
// Move (Trim(sHomePath) + "\" + Trim(sFileName)) to sFileName
// End


// End
// Else Begin
//*** Verificar a Existencia do Diretorio
Move 0 to iFlag
Direct_Input "DIR: C:\"
Repeat
Readln sLine
Uppercase sLine
If "[TEMP]" In sLine Move 1 to iFlag
Until (SeqEof)
Close_Input
//*** Caso o Mesmo nao exista Vamos Cria-lo
If (iFlag=0) Make_Directory "C:\TEMP"
Move ("C:\TEMP\" + Trim(sFileName)) to sFileName
// End
//***

// Send info_box sfilename


// Send info_box sFileName

Move 0 to iNovoArq
Structure_Start iNovoArq "DATAFLEX"
Structure_Copy hFile to iNovoArq
Set_Attribute DF_FILE_PHYSICAL_NAME of iNovoArq to (Trim(sFileName))
Structure_End iNovoArq DF_STRUCTEND_OPT_NONE
Close hFile
Open (Trim(sFileName)) as hFile
End_Procedure


Espero ter ajudado