Clipper On Line • Ver Tópico - linha de comando para acessar e alterar dados no Dbase
Mudar para estilo Clássico
Discussão sobre outras linguagens de programação.
Postar uma resposta

linha de comando para acessar e alterar dados no Dbase

01 Out 2013 16:02

Olá amigos, estou com uma dúvida, preciso alterar um arquivo pelo Dbase em alguns clientes que não possuem internet, vou ter que enviar o arquivo por CD, e se não tiver como, terei que ir pessoalmente a eles,

Estava pensando em fazer um .bat simples, apenas para acessar o dbase e alterar o registro no meu arquivo, mas existe a possibilidade?

entrar no dbase é fácil, más a partir dai, já não sei, pois os comandos que eu digitaria no dbase para acessar o arquivo como, use arquivo, no meu .bat não funciona, parece que o .bat só consegue abrir o dbase, depois disso ele não acessa mais o dbase,

Então a duvida é, como acessar, abrir o arquivo e modificar a estrutura pelo Dbase em uma linha de comando no .bat?

Abraços

linha de comando para acessar e alterar dados no Dbase

01 Out 2013 17:04

Olá!

Realmente, pelo .Bat você só conseguirá abrir o dBase...

Mas, se você tem um .DBF a ser alterado, você não precisa de um .BAT e sim um .PRG, compilado e transformado em um .EXE, que faça as tarefas que você precisa. Creio que você tenha como gerar esse executável aí.

Segue um exemplo mostrando as funcionalidades básicas para atingir seu objetivo. Adapte conforme a tua necessidade.
Código:
#include "Dbstruct.ch"

FUNCTION Main()

   CriarTabela()
   
   ConverterTabela()
   
   RETURN NIL
   
//----------------------------------------------------------------------------------
FUNCTION CriarTabela()

   // Cria uma tabela para testes
   
   LOCAL aStru := {}
   LOCAL nPos
   
   AAdd( aStru, {"Codigo", "C", 50, 0 } )
   AAdd( aStru, {"Nome", "C", 20, 0 } )
   
   DbCreate( "Teste", aStru )

   USE Teste EXCLUSIVE NEW
     
   FOR nPos := 1 TO 100
      Teste->( DbAppend() )
     
      Teste->codigo := nPos
      Teste->nome := "Nome " + LTrim( Str( nPos )
   NEXT   
   
   Teste->( DbCloseArea() )
   
   RETURN NIL
//----------------------------------------------------------------------------------
FUNCTION ConverterTabela()

   LOCAL aStru := {}
   LOCAL nPos
   LOCAL nLen

   // Abre a tabela teste e...
   USE Teste EXCLUSIVE NEW

   //  captura seu layout
   aStru := Teste->( DbStruct() )
   
   // Quantidade de campos
   nLen := Len( aStru )
   
   // Altera o tamanho do campo "Nome" de 20 para 50 bytes
   FOR nPos := 1 TO nLen
      IF aStru[ nPos, F_NAME ] == "Nome"
         aStru[ nPos, F_SIZE ] := 50
      ENDIF
   NEXT       

   // Acrescenta o campo "Cidade" com 20 bytes na nova estrutura
   AAdd( aStru, {"Cidade", "C", 20, 0 } )

   // ria uma tabela temporária com o novo layout
   DbCreate( "_Teste", aStru )

   // abre a tabela temporária (vazia)
   USE _Teste EXCLUSIVE NEW
         
   // importa os dados da tabela existente para a nova tabela, já no novo layout
   APPEND FROM Teste
   
   // fecha a temporária
   _Teste->( DbCloseArea() )
   
   // deleta a tabela original
   Ferase( "Teste.DBF" )
   
   // renomeia a nova tabela para o nome da original
   IF FRENAME("_Teste.DBF", "Teste.DBF") == -1
      Alert( "Erro ao renomear arquivo convertido (_Test.DBF)." )
   ELSE
      Alert( "Arquivo convertido com sucesso." )     
   ENDIF

   RETURN NIL
//----------------------------------------------------------------------------------     

linha de comando para acessar e alterar dados no Dbase

01 Out 2013 17:08

Oi Will,

O antigo DBase ainda vive... rs

É possivel sim. Mas não exatamente através de uma BAT. Pode até criar a BAT para chamar o DBASE e chamar o seu arquivo PRG.
Crie a sua rotina de alteração de dados no próprio PRG e no bat mande executar o nome desse PRG.

Na sua BAT, você chama also assim:

c:\dbase\DBASE <nome_do_prg>

linha de comando para acessar e alterar dados no Dbase

01 Out 2013 17:19

Quiser ler mais sobre o Dbase, aqui tem um livro eltrônico: http://books.google.com.br/books?id=K86ocU8SW7EC&pg=PA7&lpg=PA7&dq=Press+%E2%97%84%E2%94%80%E2%94%98+to+assent+to+the+License+Agreement+and+begin+dBASE+III+PLUS.&source=bl&ots=C8HFyzTnxx&sig=lTXfJYqEXF1kFNmJWUZtmkK4rkw&hl=pt-BR&sa=X&ei=Sy1LUtnuFIi88wTuj4GwDQ&ved=0CCwQ6AEwAA

linha de comando para acessar e alterar dados no Dbase

02 Out 2013 12:47

Olá!

A programação xBase nasceu exatamente dessa forma, em dBase II, agrupando-se os comandos que se digitava em arquivos textos com a extensão .CMD e acrescentando-se os comandos de controle de laço e condições.

Mas no caso desse post, como o colega faria para entrar os dados após o comando MODI STRU?

Acredito que um executável seria mais seguro e flexível.

linha de comando para acessar e alterar dados no Dbase

02 Out 2013 13:36

realmente vou criar um executável... só para garantir...

obrigado a ajuda de todos!

linha de comando para acessar e alterar dados no Dbase

02 Out 2013 19:45

Olá!

Segue o código, revisado e compilado:
Código:
#include "Dbstruct.ch"

FUNCTION Main()

   AltD()

   CriarTabela()

   ConverterTabela()

RETURN NIL

//----------------------------------------------------------------------------------
FUNCTION CriarTabela()

   // Cria uma tabela para testes

   LOCAL aStru := {}
   LOCAL nPos

   AAdd( aStru, {"Codigo", "N", 5, 0 } )
   AAdd( aStru, {"Nome", "C", 20, 0 } )

   DbCreate( "Teste", aStru )

   USE Teste EXCLUSIVE NEW

   FOR nPos := 1 TO 100
      Teste->( DbAppend() )

      Teste->codigo := nPos
      Teste->nome := "Nome " + LTrim( Str( nPos ) )
   NEXT

   Teste->( DbCloseArea() )

RETURN NIL

//----------------------------------------------------------------------------------
FUNCTION ConverterTabela()

   LOCAL aStru := {}
   LOCAL nPos
   LOCAL nLen

   // Abre a tabela teste e...
   USE Teste EXCLUSIVE NEW

   //  captura seu layout
   aStru := Teste->( DbStruct() )
   Teste->( DbCloseArea() )

   // Quantidade de campos
   nLen := Len( aStru )

   // Altera o tamanho do campo "Nome" de 20 para 50 bytes
   FOR nPos := 1 TO nLen
      IF aStru[ nPos, DBS_NAME ] == "NOME"
         aStru[ nPos, DBS_LEN ] := 50
      ENDIF
   NEXT

   // Acrescenta o campo "Cidade" com 20 bytes na nova estrutura
   AAdd( aStru, {"Cidade", "C", 20, 0 } )

   // Cria uma tabela temporária com o novo layout
   DbCreate( "_Teste", aStru )

   // abre a tabela temporária (vazia)
   USE _Teste EXCLUSIVE NEW

   // importa os dados da tabela existente para a nova tabela, já no novo layout
   APPEND FROM Teste

   // fecha a temporária
   _Teste->( DbCloseArea() )

   // deleta a tabela original
   FErase( "Teste.DBF" )

   // renomeia a nova tabela para o nome da original
   IF FRename("_Teste.DBF", "Teste.DBF") == -1
      Alert( "Erro ao renomear arquivo convertido (_Test.DBF)." )
   ELSE
      Alert( "Arquivo convertido com sucesso." )
   ENDIF

RETURN NIL
//----------------------------------------------------------------------------------

linha de comando para acessar e alterar dados no Dbase

02 Out 2013 20:44

Na seção de Downloads, está disponível o STRU que permite alteração de estrutura no banco de dados e importa os dados, talvez você possa interagir em modo remoto com o cliente (um sugestão).
Postar uma resposta