Facilitar criação de tabela no fonte

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Facilitar criação de tabela no fonte

Mensagem por JoséQuintas »

Tá tudo bem, funcionando direito, mas queria deixar isto mais reduzido.

Código: Selecionar todos

STATIC FUNCTION JPPREHISCreateMySql()

   RETURN ;
   "CREATE TABLE IF NOT EXISTS JPPREHIS ( " + ;
   "PHID     INT(11)      NOT NULL AUTO_INCREMENT, " + ;
   "PHITEM   VARCHAR(6)   NOT NULL DEFAULT '', " + ;
   "PHCADAS  VARCHAR(6)   NOT NULL DEFAULT '', " + ;
   "PHFORPAG VARCHAR(6)   NOT NULL DEFALT '', " + ;
   "PHDATA   DATE         NULL, " + ;
   "PHHORA   VARCHAR(8)   NOT NULL DEFAULT '', " + ;
   "PHVALOR  DOUBLE(16,4) NOT NULL DEFAULT '0', " + ;
   "PHOBS    VARCHAR(60)  NOT NULL DEFAULT '', " + ;
   "PHINFINC VARCHAR(80)  NOT NULL DEFAULT '', " + ;
   "PHINFALT VARCHAR(80)  NOT NULL DEFAULT '', " + ;
   "PRIMARY KEY    ( PHID ), " + ;
   "INDEX IDXITEM  ( PHITEM, PHCADAS, PHFORPAG, PHDATA DESC, PHHORA DESC ), " + ;
   "INDEX IDXCADAS ( PHCADAS, PHITEM, PHFORPAG, PHDATA ), " + ;
   "INDEX IDXDATA  ( PHDATA, PHITEM, PHCADAS, PHFORPAG ) " + ;
   ") COLLATE=latin1_swedish_ci ENGINE=InnoDB"
Parece que qualquer tentativa de reduzir isso acaba causando um fonte difícil de "enxergar".
Alguém conseguiu algo interessante pra isso?

Notas:
- A estrutura do DBF parece não resolver, porque é mais limitada
- O índice faz parte da estrutura no SQL
- O único inconveniente assim é gastar espaço de string no EXE, nem sei uma alteração vai economizar alguma coisa no resultado final.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Facilitar criação de tabela no fonte

Mensagem por rubens »

Quintas...

Ignorância minha, isso aí por exemplo não poderia ser utilizado em STORE PROCEDURES ?

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Facilitar criação de tabela no fonte

Mensagem por JoséQuintas »

A intenção é: criou a base de dados pronto, o aplicativo faz o resto, sem intervenção manual.
Pra existirem as stored procedures, precisaria algo mais já na base de dados.
(sem falar que ainda não aprendi isso.... rs)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Facilitar criação de tabela no fonte

Mensagem por JoséQuintas »

Só voltando um pouco ao assunto:

Minha intenção é o aplicativo continuar criando tudo do zero.
Praticamente só defino o nome do banco de dados, usuário e senha, e o aplicativo faz o resto.
Tá equivalente a:

Código: Selecionar todos

IF .NOT. File( "arquivo.dbf" )
   dbCreate( "arquivo.dbf", ... )
ENDIF
IF .NOT. File( "arquivo.cdx" )
   INDEX ON ...
ENDIF
Pra usar stored procedures (rotinas dentro da base), depende das rotinas existirem, o que seria equivalente a já existir um banco de dados com conteúdo.
Mas e aí? Como essas stored procedures chegariam ao banco de dados? Se for pra copiar uma base pronta, tanto faz se for stored procedure ou a base com as tabelas prontas.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Facilitar criação de tabela no fonte

Mensagem por alxsts »

Olá!

Um recurso que pode ser usado para evitar as concatenações de strings e melhorar a legibilidade deste tipo de código é o comando TEXT. Veja exemplo:

Código: Selecionar todos

//------------------------------------------------------------------------------

STATIC FUNCTION ScriptGenerator()

   LOCAL cSql As Character
   LOCAL aRet As Array

   aRet := {}

   TEXT INTO cSql
      USE [Harbour]

      /****** Object:  Table [dbo].[tbAddressType]    Script Date: 09/04/2014 20:18:23 ******/
      SET ANSI_NULLS ON
      SET QUOTED_IDENTIFIER ON
      SET ANSI_PADDING ON

      CREATE TABLE [dbo].[tbAddressType](
      	[idAddressType] [int] IDENTITY(1,1) NOT NULL,
      	[dsAddressType] [varchar](20) NOT NULL,
       CONSTRAINT [XPKtbAddressType] PRIMARY KEY CLUSTERED
      (
      	[idAddressType] ASC
      )WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
      ) ON [PRIMARY]

      SET ANSI_PADDING OFF
   ENDTEXT

   AAdd( aRet, cSql )

   // demais tabelas...

RETURN aRet
   //---------------------------------------------------------------------------
Depois executa cada um dos scripts:

Código: Selecionar todos

TablesGenerator( ScriptGenerator() )

Código: Selecionar todos

//------------------------------------------------------------------------------

STATIC FUNCTION TablesGenerator( aScripts )

   LOCAL cSql As Character
   LOCAL lRet As Logical

   lRet := .F.
      
   Try
      oCn:Open()

      For Each cSql In aScripts
         oCn:Execute( cSql )
      Next

      lRet := .T.
      
   Catch oErr
      Throw( oErr )
   Finally
      If oCn:state() = adStateOpen
         oCn:Close()
      Endif
   End

RETURN lRet
//------------------------------------------------------------------------------
A sintaxe acima é do MS SQL Server.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Facilitar criação de tabela no fonte

Mensagem por JoséQuintas »

Não deu certo, mas lembrando que a string vai ficar maior ainda, já que até os espaços em branco iriam contar.
Tentei isto:

Código: Selecionar todos

STATIC FUNCTION JPPREHISCreateMySql( cTxt )

   TEXT INTO cTxt
      CREATE TABLE IF NOT EXISTS JPPREHIS (
      PHID     INT(11)      NOT NULL AUTO_INCREMENT,
      PHITEM   VARCHAR(6)   NOT NULL DEFAULT '',
      PHCADAS  VARCHAR(6)   NOT NULL DEFAULT '',
      PHFORPAG VARCHAR(6)   NOT NULL DEFAULT '',
      PHDATA   DATE         NULL,
      PHHORA   VARCHAR(8)   NOT NULL DEFAULT '',
      PHVALOR  DOUBLE(16,4) NOT NULL DEFAULT '0.0',
      PHOBS    VARCHAR(60)  NOT NULL DEFAULT '',
      PHINFINC VARCHAR(80)  NOT NULL DEFAULT '',
      PHINFALT VARCHAR(80)  NOT NULL DEFAULT '',
      PRIMARY KEY    ( PHID ),
      INDEX IDXITEM  ( PHITEM, PHCADAS, PHFORPAG, PHDATA DESC, PHHORA DESC ),
      INDEX IDXCADAS ( PHCADAS, PHITEM, PHFORPAG, PHDATA ),
      INDEX IDXDATA  ( PHDATA, PHITEM, PHCADAS, PHFORPAG )
      ) COLLATE=latin1_swedish_ci ENGINE=InnoDB
   ENDTEXT

   RETURN cTxt
Como não aceita a TEXT INTO cTxt, dá erro em todo resto.
rccriamysql.prg:632: error E0030 Syntax error "syntax error at 'INTO'"

rccriamysql.prg:633: error E0030 Syntax error "syntax error at 'TABLE'"

rccriamysql.prg:634: error E0030 Syntax error "syntax error at 'INT'"

rccriamysql.prg:635: error E0030 Syntax error "syntax error at 'VARCHAR'"

rccriamysql.prg:636: error E0030 Syntax error "syntax error at 'VARCHAR'"

rccriamysql.prg:637: error E0030 Syntax error "syntax error at 'VARCHAR'"
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Facilitar criação de tabela no fonte

Mensagem por JoséQuintas »

Talvez uma opção seja incluir todos os comandos como resource.
Vou testar depois.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Facilitar criação de tabela no fonte

Mensagem por alxsts »

Olá!

Funciona perfeitamente com o Harbour 3.2. Certamente o problema de não aceitar TEXT INTO é no Harbour 3.4. Precisa ver o que o Viktor pode fazer para compatibilizar as duas versões.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Facilitar criação de tabela no fonte

Mensagem por JoséQuintas »

Correção: Isso é do xHarbour.

Código: Selecionar todos

#include "hbcompat.ch"

PROCEDURE Main

LOCAL x

TEXT INTO x
   sdfsfdsdfds
   sdfsdfsdsfds
   sdfsdfdsfsdfds
ENDTEXT

CLS
? x

RETURN

Código: Selecionar todos

hbmk2 test xhb.hbc
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Facilitar criação de tabela no fonte

Mensagem por alxsts »

Olá!

Este código que postei foi escrito faz anos e nem me lembrava deste include (hbCompat.ch).
JoséQuintas escreveu:Correção: Isso é do xHarbour.
Correto. Na minha opinião, este fato não inviabiliza o uso do comando, que é uma tradução conseguida através do pré processador, como todos os comandos xBase.

Código: Selecionar todos

   /* TEXT INTO <varname> */
   #xcommand TEXT INTO <v> => #pragma __text|<v>+=%s+hb_eol();<v>:=""
Penso que o ganho em legibilidade justifica o uso (evita aquelas concatenações de strings horrorosas).
[]´s
Alexandre Santos (AlxSts)
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Facilitar criação de tabela no fonte

Mensagem por wmanesco »

Olá pessoal!

Recentemente venho desenvolvendo uma classe com este intuito, de criar tabelas. Ainda não está finalizada mas está criando tabelas simples e não possui metodos para criar indices ainda.

Apenas para exemplificar vou mostrar como seria o uso e caso alguem se interesse coloco o código para download em algum local.
Lembrando que não está tão robusto.

A idéia é a seguinte:

Código: Selecionar todos

   oClientes := DBTables():new( "clientes" )

   oClientes:int("id"):notNull():autoIncrement():uniqueIndex():primaryKey() //Adiciona um campo INT not null, auto increment, unique Index e primary Key.
   oClientes:string( "razao_social", 100 ):notNull() //adiciona um VARCHAR de tamanho 100 e not null
   oClientes:string( "telefone", 11 ) adiciona um VARCHAR de tamanho 11
   oClientes:string( "ie", 11 )
   oClientes:string( "cnpj", 15 )
   oClientes:string( "endereco", 150 )
   oClientes:string( "cep", 8 )
   oClientes:date("datacadastro") // adiciona um campo data
   oClientes:decimal("limite", 11, 2) // adiciona um decimal 11, 2 )
   oClientes:create()
Funciona assim: Cada vez que chamo um comando ele vai guardando os campos em um array de objetos (cada tipo é um objeto), chamando o create() corre o array e monta uma string de inserção no banco.

Estou trabalhando quando é possível para criar um método de update, assim seria muito simples alterar campos nas tabelas sem precisar ficando alter table, mas estou encontrando algumas dificuldades de desenvolver este método.

Desenvolvi com a idéia base com que funciona um framework para php(que esqueci o nome agora kk)

Abraços.
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Facilitar criação de tabela no fonte

Mensagem por wmanesco »

Lembrei o nome do framework php, é laravel!
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

Facilitar criação de tabela no fonte

Mensagem por jairfab »

wmanesco, tem como você disponibilizar eu fiquei interessado pois estou fazendo a conversão de um sistema DBF para banco de dados FIREBIRD e tenho muitas tabelas para ser criadas
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Facilitar criação de tabela no fonte

Mensagem por wmanesco »

Assim que conseguir subir eu post o link aqui!
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

Facilitar criação de tabela no fonte

Mensagem por wmanesco »

William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Responder