BEMAFI.PRG
Moderador: Moderadores
-
Sergio Cabral
- Usuário Nível 2

- Mensagens: 52
- Registrado em: 18 Set 2004 18:51
- Localização: São José dos Campos
BEMAFI.PRG
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
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
Sou programador em Clipper 5.01 a 15 anos e procuro melhorar meus conhecimentos. Este site me parece muito bom e poderemos nos ajudar.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
BEMAFI
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
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
-
support sistemas
- Usuário Nível 2

- Mensagens: 73
- Registrado em: 22 Set 2005 23:43
- Localização: Londrina
-
Alessandro
- Usuário Nível 3

- Mensagens: 141
- Registrado em: 07 Jul 2004 09:39
- Localização: Santo Antonio da Platina-PR
-
support sistemas
- Usuário Nível 2

- Mensagens: 73
- Registrado em: 22 Set 2005 23:43
- Localização: Londrina
-
Alessandro
- Usuário Nível 3

- Mensagens: 141
- Registrado em: 07 Jul 2004 09:39
- Localização: Santo Antonio da Platina-PR
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinhos:
Sergio Cabral:
Coloque o seguinte codigo no inicio de seu arquivo BEMAFI.PRG:
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:
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 :?)
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
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()
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 :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
