Página 1 de 1

BEMAFI.PRG

Enviado: 16 Ago 2006 20:13
por Sergio Cabral
Meu programa é em Clipper 5.01.
Compilei o meu programa junto com o BEMAFI.PRG para poder definir onde eu quero que seja criado o arquivo BEMAFI.CMD (no caso c:\DOS),
Na rotina BEMAFI.PRG tem o comando FILESIZE que não tem no Clipper 5.01, então eu peguei uma rotina colocada neste forum mas ao executar o programa onde é utlizado o arquivo BEMAFI.PRG, aparece a seguinte mensagem : "Programa muito grande para ser alocado na memória"

Alguém sabe como resolver isto???

Abaixo a rotina do BEMAFI.PRG com a modificação:

// BEMATECH

#include "Fileio.ch"
#include "fiscal.ch"

///////
FUNCTION fopen_bema
///////
Parameters ponteiro, modo

if !file(ponteiro+"b")
nHandle = fOpen("BEMAFI.INI", FO_READWRITE)
aux = -1 //aux de retorno

if FERROR() = 0 //Confirma se abriu
nTam = FSeek(nHandle, 0, FS_END) //tamanho do arquivo para verificar se existe
if nTam > 0
FileTop(nHandle)

FSeek ( nHandle, 19, FS_SET )

FWrite( nHandle, if(UPPER(ponteiro) = "COM1", "0", if( UPPER(ponteiro) = "COM2", "1", if( UPPER(ponteiro) = "COM3", "2", "3"))), 1)

if FERROR() = 0
aux = 6
else
aux = -1
endif
endif
fvar(ponteiro+"b", " ", "E")
endif
Fclose(nHandle)
else
aux = 6
endIf
return aux

///////
FUNCTION FWrite_bema
///////
PARAMETERS ponteiro, comando, qtde

Delete File( "c:\dos\BEMAFI.CMD" )
Delete File( "STATUS.TXT" )
Delete File( "RETORNO.TXT" )

if len(comando) = qtde
nHandle = FCreate( "c:\dos\BEMAFI.CMD" )
FWrite( nHandle, @Comando, Len( Comando ) )
if FERROR() = 0
FClose( nHandle )
!BEMAFI.EXE
situacao = len(comando) //retorno padrao do fwrite
else
situacao = 0
endif
endif

Return Situacao


///////
FUNCTION Fread_bema
///////
PARAMETERS ponteiro, retorno, qtde

LOCAL nStatus
LOCAL nRetorno := " "
sRetorno = " "
if File("STATUS.TXT")

nStatus = Fopen("STATUS.TXT")
nTamStatus = FSeek( nStatus, 0, FS_END )
Fclose(nStatus)
nStatus = Fopen("STATUS.TXT")
sStatus = " "
posStatus = 0
aux_Status = " "
vezes = val(Fvar("VEZES","1","L"))
if nTamStatus > 0
for posStatus = 1 to nTamStatus
FRead( nStatus, @aux_status, 1)
sStatus = sStatus + aux_status
next
fclose(nStatus)
if vezes = 1 //escreve o retorno de acordo com n-vezes
sRetorno = chr(val(Left(sStatus,4)))
else
if vezes = 2
sRetorno = chr(val(substr(sStatus, 5,3)))
else
if vezes = 3
sRetorno = chr(val(Right(sStatus, 3)))
Delete File ("VEZES")
Delete File ("STATUS.TXT")
endIf
endIf
endIf
if !(vezes >= 3)
vezes++
Fvar("VEZES", str(vezes), "E")
Fclose(nStatus)
endif
endif

else

if FILE("RETORNO.TXT")

nHandle = fOpen("RETORNO.TXT")
nTamRetorno = FSeek( nHandle, 0, FS_END )
fclose( nHandle )

indice = fvar( "INDICE", "1", "L" )

nHandle = FOpen("RETORNO.TXT")

PosRetorno = 0

for PosRetorno = 1 to val(indice)
FRead(nHandle, @nRetorno, 1)
next
fclose(nHandle)

indice = STR(val(indice)+1)

fvar("INDICE", LTRIM(indice), "E")

if val(LTRIM(indice)) > nTamRetorno
delete file ("RETORNO.TXT")
delete file ("INDICE")
endIf
else
sRetorno = " "
endIf

if (nRetorno != " ")
sretorno := nRetorno
endIf

endif
retorno = sretorno
return if (sretorno = " ",0, 1)

////////////////////
FUNCTION fvar
////////////////////
PARAMETERS variavel, valor, ler
aux = " "
aux1 = " "
ContVar = 0
if FILE ( variavel ) .AND. UPPER(Ler) = "L"
nHandle = FOpen(variavel)
nTam := FSEEK(nHandle, 0, FS_END)
* nTam = FileSize(nHandle) // era este o comando usado originalmente
FClose(nHandle)
nHandle = FOpen(variavel)
for ContVar = 1 to nTam
FRead(nHandle, @aux1, 1)
aux := aux + aux1
next
else
nHandle = FCreate( Variavel )
Fwrite(nHandle, ltrim(valor), len(valor))
aux = ltrim(valor)
endif
Fclose(nHandle)

RETURN AUX

BEMAFI

Enviado: 16 Ago 2006 20:42
por Pablo César
Caro Sergio,

Como eu disse, não tenho experiência com essa parte fiscal. Tenho impremido nessas impressoras a doidado. Não analizei o teu fonte aqui postado. Mas acho que você deveria passar JÁ à versão do CLIPPER 5.2. Que eu saiba a versão 5.1 tem alguns BUGS. Não use mais essa versão. Você não terá nada que fazer nos teus fontes para mudar a versão. Só instalar o 5.2e ou 5.3, eu prefiro 5.2 (por enquanto). A outra questão que diz "Programa muito grande para ser alocado na memória", deve ser porque não gerou o executável adequadamente. Tente com CLIPPER 5.2.

E se tem algum erro, poste tuas dúvidas.

Boa sorte, :)Pos

Enviado: 25 Out 2006 13:55
por support sistemas
Sergio Cabral vc conseguiu resolver seu problema ???


Se sim informe como

Enviado: 25 Out 2006 14:43
por Alessandro
Sérgio

Passei pelo mesmo problema, e realmente a migração para o 5.2 é inevitável, se for usar do bemafi.exe.

Enviado: 25 Out 2006 19:20
por support sistemas
ja passei para clipper 52 e continua o mesmo problema


funcao FILESIZE nao exite

Enviado: 26 Out 2006 06:55
por Alessandro
Verifique se não está faltando na compilação a bemafi.lib, blxclp52.lib, e se está carregando o fiscal.ch.

No meu funcionou corretamente, qq problema poste o erro, o código, para podermos ajudar melhor.

OK

Enviado: 26 Out 2006 07:32
por Genildo
quando eu descobrir como se usa um ALIAS eu posso dar opinião rsss

Enviado: 27 Out 2006 00:24
por rochinha
Amiguinhos:

Sergio Cabral:

Coloque o seguinte codigo no inicio de seu arquivo BEMAFI.PRG:

Código: Selecionar todos

#define FileTop(nHandle) (FSEEK(nHandle, 0, 1))
#define FileSize(nHandle, tam) ( tam := FSEEK(nHandle, 0, FS_END) ) //Escreve em tam o tamanho do arquivo
#define FilePos (nHandle, pos) ( pos := FSEEK(nHandle, 0, 1)      ) //Escreve em pos a posicao atual
#define FileaPos(nHandle, pos) ( FSEEK(nHandle, pos, FS_SET)      ) //Vai para a pos
Na verdade estes comandos não existem nem no Clipper 5.3 a não ser que use a CA-Tools ou outra LIB como NANFOR.

Genildo:

ALIAS é um parametro opcional do comandos USE que serve para voce trocar o nome de uma tabela on-the-fly, ou seja, enquanto aberta.

Exemplo:

Código: Selecionar todos

USE clientes ALIAS cliente1 NEW
USE clientes ALIAS cliente2 NEW
USE clientes ALIAS cliente3 NEW
...
SELE cliente1
SET FILTER TO cliente1->estado = "SP"
browse()

SELE cliente3
SET FILTER TO cliente1->estado = "RJ"
browse()

SELE cliente2
browse()
No exemplo eu abri várias vezes o arquivos CLIENTES o que seria impossivel caso não usasse o ALIAS desta forma eu posso mudar para qualquer uma das áreas e trabalhar com elas como se fossem arquivos diferentes.

Isto serve quando voce precisa fazer um levantamento de informações de um mesmo local, mas depende muito do que se precisa pra usar esta técnica.

@braços :?)