Clipper On Line • Ver Tópico - Facilitar criação de tabela no fonte

Facilitar criação de tabela no fonte

Discussão sobre SQL

Moderador: Moderadores

 

Facilitar criação de tabela no fonte

Mensagempor JoséQuintas » 07 Out 2016 16:04

Tava pensando em algo menos radical, tipo isto:

cString := "CREATE TABLE CLIENTES ( " + ;
   CampoMySql( "CODIGO", "I" , 11, 0, .F., "AUTO_INCREMENT" ) + ;
   CampoMySql( "NOME", "V", 100, 0, .T., "DEFAULT ''" ) + ")"

FUNCTION CampoMySql( cName, cType, nLen, nDec, lNull, cCompl )

   LOCAL cText := ""

   cText += cName
   DO CASE
   CASE cType == "C"; cText += "CHAR"
   CASE cType == "D"; cText += "DECIMAL"
   CASE cType == "I" ; cText += "INT"
   CASE cType == "V", cText += "VARCHAR"
   ENDCASE
   cText += " (" + Ltrim(Str(nLen)) + iif( nDecimal == 0, "", ", " + Ltrim( Str(nDecimal) ) ) + ") "
   cText += " " + iif( lNull, "NULL", "NOT NULL" )
   IF ! Empty( cCompl )
      cText += cCompl
   ENDIF
   RETURN cText


Só pra deixar as partes alinhadas, sem encher de string no EXE.
Mesmo assim, parece que não compensa.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10263
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 653 vezes

Facilitar criação de tabela no fonte

Mensagempor wmanesco » 07 Out 2016 21:25

Tem opção de trabalhar com array, já vi uma vez mas não lembro certinho a estrutura mas a idéia é a seguinte:

FUNCTION CriaTbelas()

   LOCAL aTabela

   FOR EACH aTabela IN EstruturaTabelasSistema()
      //Aqui seria desenvolvido o código montando a string.
   NEXT

RETURN

/****************************************************/
FUNCTION EstruturaTabelasSistema()

   LOCAL aTabelas := {}, aTabela

   //ESTRUTURA
   //NOME, TIPO, TAMANHO, DECIMAL, AUTO INCREMENT (pode ser adicionado mais campos tipo um campo para dizer se é primary key)

   aTabela := {"CLIENTES", {"ID"      , "N", 10, 0, .T. },;
                                       {"NOME", "C", 50, 0, .F. };
                   }

   AAdd(aTabelas, aTabela)

RETURN aTabelas



Algo neste sentido acho que fica bom também sem ser tão radical
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
wmanesco
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 118
Data de registro: 09 Set 2016 13:18
Cidade/Estado: ITAJAI - SC
Curtiu: 13 vezes
Mens.Curtidas: 4 vezes

Facilitar criação de tabela no fonte

Mensagempor JoséQuintas » 07 Dez 2016 14:39

Como eu já comentei uma vez:

A parte mais crítica, aonde temos mais pressa, é pra resolver bugs.
Então o fonte tem que estar direcionado a ver rápido do que se trata.
Na dúvida sobre qual fica melhor, melhor deixar o que permite resolver bugs rapidamente.
Ao não perder tempo com bugs, sobra mais tempo pra criação/melhoria.

Também é interessante já criar estrutura e índices de uma vez, assim qualquer coisa errada já aparece o alerta.

Por enquanto ainda vou mantendo o original do início do post.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10263
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 653 vezes

Facilitar criação de tabela no fonte

Mensagempor hazael » 15 Dez 2016 20:26

Se aceitam minha humilde opinião:

Gostei muito da idéia do Rubens -> Stored Procedures, acho que é possível fazer isso na criação do BD, mas não testei mas vejo aí um ganho em performance e isso pode ser relevante (mas como disse antes... não testei... e talvez seria melhor fazer isso no PostgreSQL)

Mas achei a solução do Alexandre Santos a mais interessante: TEXT INTO cVar
O ganho em legibilidade é grande, fica completamente limpo e fácil de manter. Acho essa vantagem difícil de superar.
Essa é a mesma recomendação do guia ADS e Xbase++ do Roger Donnay aqui (pág. 12-13

O problema com pre-processador e com os espaços pode ser facilmente contornado

Além de hbcompat.ch tem também hbxpp.ch que tem o comando 'TEXT INTO', veja a diferença entre ambas:

hbcompat.ch
   /* TEXT INTO <varname> */
   #xcommand TEXT INTO <v> => #pragma __text|<v>+=%s+hb_eol();<v>:=""


hbxpp.ch
/* TEXT INTO <varname> [WRAP [<cEOL>]] [TRIMMED]  */
#xcommand TEXT INTO <v> [<wrp:WRAP>] [<trm:TRIMMED>] => ;
            #pragma __text | <v> += iif( <.trm.>, LTrim( %s ), %s ) +;
                                    iif( <.wrp.>, hb_eol(), "" ); <v> := ""
#xcommand TEXT INTO <v> WRAP [<EOL>] [<trm:TRIMMED>] => ;
            #pragma __text | <v> += iif( <.trm.>, LTrim( %s ), %s ) +;
                                    iif( <.EOL.>, <EOL>, hb_eol() ); <v> := ""


Talvez tudo que precisamos aqui é um pouco de limpeza para não incluir espaços extras, line feed, carriage return e tabs...

Vejamos este exemplo:
/* TEXT INTO <varname> [WRAP [<cEOL>]] [TRIMMED]  */
#xcommand TEXT INTO <v> [<wrp:WRAP>] [<trm:TRIMMED>] => ;
            #pragma __text | <v> += iif( <.trm.>, LTrim( %s ), %s ) +;
                                    iif( <.wrp.>, hb_eol(), "" ); <v> := ""
#xcommand TEXT INTO <v> WRAP [<EOL>] [<trm:TRIMMED>] => ;
            #pragma __text | <v> += iif( <.trm.>, LTrim( %s ), %s ) +;
                                    iif( <.EOL.>, <EOL>, hb_eol() ); <v> := ""

////////////////////////////////////////////////////////////////////////////////
PROCEDURE Main()

   LOCAL cVar

   CLS

   TEXT INTO cVar WRAP TRIMMED

      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
   
   SETCOLOR( 'GR+/N' ) 
   ? cVar

   SETCOLOR( 'R+/N' )
   ? Limpa( cVar )

   INKEY(0)

RETURN

////////////////////////////////////////////////////////////////////////////////
FUNCTION Limpa( cVar )

   cVar := STRTRAN( cVar, CHR(9), '' )
   cVar := STRTRAN( cVar, CHR(10), ' ' )
   cVar := STRTRAN( cVar, CHR(13), '' )
   WHILE '  ' $ cVar; cVar := STRTRAN( cVar, '  ', ' ' ); END

RETURN ALLTRIM( cVar )


E o resultado:
resultado.jpg


No resultado pode ver a query ainda formatada em amarelo e a query 'limpa' em vermelho, compressed para ser usada na DDL do DB.
Claro, isso requer incluir este 'novo' commando (caso não queira incluir hbxpp.ch) mas o resultado é bem interessante.
Aliás, não sei por quê isso não está no core do Harbour... José, você gostaria de perguntar sobre isso na lista Harbour?

Mas mesmo assim, acho que compensa, não acha que resolve?
Harbour | GTWVT | MingW | Visual Studio Code
Avatar de usuário

hazael
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 492
Data de registro: 27 Nov 2016 12:59
Curtiu: 8 vezes
Mens.Curtidas: 35 vezes

Anterior



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro