Clipper On Line • Ver Tópico - SQL - Dúvidas

SQL - Dúvidas

Discussão sobre SQL

Moderador: Moderadores

 

SQL - Dúvidas

Mensagempor leandrolinauer » 20 Fev 2021 09:26

Bom dia a todos.
Sou leigo em SQL, estou estudando ele agora depois de 27 anos em DBF, então me pairam muitas dúvidas no ar as quais não encontrei nenhuma informação a respeito ou clara, estudei vários tutoriais e books na internet mas não encontrei equivalência para as dúvidas e não tenho ninguém em minha cidade para trocar ideia relativa sobre os temas.
1 - Gravar os campos: Devemos gravar quando o resultado for vazio NULO ou ESPAÇOS ou equivalentes a cada tipo abaixo?

Exemplo: (ENDERECO,C,60) = vazio receberá NULL ou SPACE(60)
NULL: Economiza espaço no banco de dados ou não, porque em DBF mandava vazio = space(60) e pronto.

Também quando gravar menor que o tamanho total, devo enviar com espaços no final até o tamanho total do campo ou somente o conteudo limpo do final dos espaços?
Exemplo: "RUAL TAL"
ENDERECO deve receber "RUA TAL" ou "RUA TAL"+ mais espaços restantes
Pergunto isto para não mal influenciar na busca e pesquisa de dados futuros, qual é o ideal?

Pelo que vi e testei o certo é enviar "RUA TAL" somente e ao buscar os dados para editar por exemplo devemos completar a variavel.
VarEndereco:="RUA TAL"+ restante do tamanho do campo

e para os demais tipos abaixo:

TIPOS
[ VARCHAR]
[ DATE]
[NUMERIC]
[INTEGER]
[SMALLINT]

2 - Bloquear o registro em uso ( tipo dbf = RLOCK/DBUNLOCK)

3 - E para confirmar a gravação dos dados (comit) , eu uso a função abaixo adquirida pela a ajuda aqui no fórum.
Function FB_executa()
   local _men:=""

   &(oSQL_Conect):Setsql( StrSql )
   if !&(oSQL_Conect):open()
      _men:= &(oSQL_Conect):SQLErrorMessage()
   endif
   If !Empty(_men)
      DB_SQL_Erro(_men,StrSql)
   EndIf
return _men



Esta função já faz a gravação na tabela corretamente, não sendo necessário mais nada?

Já consegui com a ajuda de todos a fazer um cadastro com inserção, alteração e exclusão em SQL firebird, mas antes de seguir em frente para o sistema todo, necessito sanar as dúvidas acima para não criar algo errado para depois não conseguir consertar futuramente.

Grato a todos.
Um abraço a todos.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 377
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

SQL - Dúvidas

Mensagempor Fernando queiroz » 20 Fev 2021 11:23

leandrolinauer escreveu:1 - Gravar os campos: Devemos gravar quando o resultado for vazio NULO ou ESPAÇOS ou equivalentes a cada tipo abaixo?
2 - Bloquear o registro em uso ( tipo dbf = RLOCK/DBUNLOCK)
3 - E para confirmar a gravação dos dados (comit) , eu uso a função abaixo adquirida pela a ajuda aqui no fórum.

Grato a todos.
Um abraço a todos.


vamos por parte

pergunta 1 - se for nulo ou vazio nao grave esquece o campo (no DB defina o PADRAO "null" "0" "auto_increment" "0000-00-00" )
pergunta 2 - relaxa isso não é necessário , o banco de dados se vira com isso
pergunta 3 - mesma resposta da pergunta 2

exemplo de INSERT
      cQuery1   :="INSERT INTO PRODUTOS ( "
      cQuery2   :=" VALUES ("
      cQuery1 += "PRODUTOS.DESPRO, "
      cQuery2   += "'" + RTRIM(TIRACENTO(upper(DESPRO))) + "', "
      cQuery1 += "PRODUTOS.EAN13, "
      cQuery2   += "'" + LTRIM(STR(EAN13)) + "', "
      cQuery1 += "PRODUTOS.PROSER, "
      cQuery2   += "'" + PROSER + "', "
      cQuery1 += "PRODUTOS.CODREF, "
      cQuery2   += "'" + RTRIM(CODREF) + "', "
      cQuery1 += "PRODUTOS.EXTIPI, "
      cQuery2   += "'" + LTRIM(STR(EXTIPI,3,0)) + "', "   
      cQuery1 += "PRODUTOS.GENERO, "
      cQuery2   += "'" + LTRIM(STR(GENERO,2,0)) + "', "         
      cQuery1 += "PRODUTOS.NCM, "
      cQuery2   += "'" + LTRIM(STR(NCM,8,0)) + "', "   
      cQuery1 += "PRODUTOS.TIPUNI, "
      cQuery2   += "'" + TIPUNI + "', "   
      IF ESTMIN != 0      
         cQuery1 += "PRODUTOS.ESTMIN, "
         cQuery2   += "'" + LTRIM(STR(ESTMIN,6,0)) + "', "   
      ENDIF
      IF ULPRCUS != 0.00      
         cQuery1 += "PRODUTOS.ULPRCUS, "
         cQuery2   += "'" + LTRIM(STR(ULPRCUS,14,2)) + "', "   
      ENDIF
      cQuery1 += "PRODUTOS.DTPRCUS, "
      cQuery2   += "'" + Hb_DTOC(DTPRCUS, "YYYY-MM-DD") + "', "      
      IF SUBTRIB != 0.00
         cQuery1 += "PRODUTOS.SUBTRIB, "
         cQuery2   += "'" + LTRIM(STR(SUBTRIB,7,2)) + "', "   
      ENDIF
      IF ALIQICMS != 0.00
         cQuery1 += "PRODUTOS.ALIQICMS, "
         cQuery2   += "'" + LTRIM(STR(ALIQICMS,7,2)) + "', "      
      ENDIF
      IF OUTTRIB != 0.00
         cQuery1 += "PRODUTOS.OUTTRIB, "
         cQuery2   += "'" + LTRIM(STR(OUTTRIB,7,2)) + "', "   
      ENDIF
      IF CUSREAL != 0.00
         cQuery1 += "PRODUTOS.CUSREAL, "
         cQuery2   += "'" + LTRIM(STR(CUSREAL,7,2)) + "', "         
      ENDIF
      IF PRECUS != 0.0000
         cQuery1 += "PRODUTOS.PRECUS, "
         cQuery2   += "'" + LTRIM(STR(PRECUS,14,4)) + "', "
      ENDIF
      IF FRETE != 0.00      
         cQuery1 += "PRODUTOS.FRETE, "
         cQuery2   += "'" + LTRIM(STR(FRETE,14,2)) + "', "   
      ENDIF
      IF ICMS != 0.00
         cQuery1 += "PRODUTOS.ICMS, "
         cQuery2   += "'" + LTRIM(STR(ICMS,14,2)) + "', "   
      ENDIF
      IF IPI != 0.00
         cQuery1 += "PRODUTOS.IPI, "
         cQuery2   += "'" + LTRIM(STR(IPI,14,2)) + "', "   
      ENDIF
      IF OUTROS != 0.00
         cQuery1 += "PRODUTOS.OUTROS, "
         cQuery2   += "'" + LTRIM(STR(OUTROS,14,2)) + "', "   
      ENDIF
      IF PERLUC != 0.00000
         cQuery1 += "PRODUTOS.PERLUC, "
         cQuery2   += "'" + LTRIM(STR(PERLUC,7,5)) + "', "   
      ENDIF
      IF PREVEN != 0.0000
         cQuery1 += "PRODUTOS.PREVEN, "
         cQuery2   += "'" + LTRIM(STR(PREVEN,14,4)) + "', "   
      ENDIF
      cQuery1 += "PRODUTOS.DATALT, "
      cQuery2   += "'" +  Hb_DTOC(M->DAT_HOJE, "YYYY-MM-DD")  + "', "   
      cQuery1 += "PRODUTOS.USUALT, "
      cQuery2   += "'" + RTRIM(M->OPERADOR) + "', "   
      IF ISS != 0.00      
         cQuery1 += "PRODUTOS.ISS, "
         cQuery2   += "'" + LTRIM(STR(ISS,5,2)) + "', "   
      ENDIF
      IF ! EMPTY(ICMS_REGIM )
         cQuery1 += "PRODUTOS.ICMS_REGIM, "
         cQuery2   += "'" + ICMS_REGIM + "', "
      ENDIF
      cQuery1 += "PRODUTOS.ICMS_ST, "
      cQuery2   += "'" + ICMS_ST + "', "
      cQuery1 += "PRODUTOS.ICMS_ORIGE, "
      cQuery2   += "'" + ICMS_ORIGE + "', "
      cQuery1 += "PRODUTOS.n_modBC, "
      cQuery2   += "'" + STRZERO(n_modBC,1,0) + "', "
      cQuery1 += "PRODUTOS.ICMS_CFOP, "
      cQuery2   += "'" + STRZERO(ICMS_CFOP,4,0) + "', "
      cQuery1 += "PRODUTOS.ICMS_CFOPI, "
      cQuery2   += "'" + STRZERO(ICMS_CFOPI,4,0) + "', "
      cQuery1 += "PRODUTOS.ICMS_CFOJL, "
      cQuery2   += "'" + STRZERO(ICMS_CFOJL,4,0) + "', "
      cQuery1 += "PRODUTOS.ICMS_CFOPD, "
      cQuery2   += "'" + STRZERO(ICMS_CFOPD,4,0) + "', "
      cQuery1 += "PRODUTOS.MAXVEN, "
      cQuery2   += "'" + LTRIM(STR(MAXVEN,10,2)) + "', "
      cQuery1 += "PRODUTOS.PESO, "
      cQuery2   += "'" + LTRIM(STR(PESO,8,3)) + "', "
      cQuery1 += "PRODUTOS.q_IPIst, "
      cQuery2   += "'" + q_IPIst + "', "
      cQuery1 += "PRODUTOS.q_IPItc, "
      cQuery2   += "'" + q_IPItc + "', "      
      cQuery1 += "PRODUTOS.q_IPIpAli, "
      cQuery2   += "'" + LTRIM(STR(q_IPIpAli,5,2)) + "', "      
      cQuery1 += "PRODUTOS.q_IPIvAli, "
      cQuery2   += "'" + LTRIM(STR(q_IPIvAli,5,2)) + "', "
      cQuery1 += "PRODUTOS.o_cEnc, "
      cQuery2   += "'" + o_cEnc + "', "   
      cQuery1 += "PRODUTOS.q_PISst, "
      cQuery2   += "'" + q_PISst + "', "
      cQuery1 += "PRODUTOS.q_PIStc, "
      cQuery2   += "'" + q_PIStc + "', "      
      cQuery1 += "PRODUTOS.q_PISpAli, "
      cQuery2   += "'" + LTRIM(STR(q_PISpAli,5,2)) + "', "      
      cQuery1 += "PRODUTOS.q_PISvAli, "
      cQuery2   += "'" + LTRIM(STR(q_PISvAli,5,2)) + "', "   
      cQuery1 += "PRODUTOS.s_COFst, "
      cQuery2   += "'" + s_COFst + "', "         
      cQuery1 += "PRODUTOS.s_COFtc, "
      cQuery2   += "'" +s_COFtc  + "', "      
      cQuery1 += "PRODUTOS.s_COFpAli, "
      cQuery2   += "'" + LTRIM(STR(s_COFpAli,5,2)) + "', "   
      cQuery1 += "PRODUTOS.s_COFvAli, "
      cQuery2   += "'" + LTRIM(STR(s_COFvAli,5,2)) + "', "   
      cQuery1 += "PRODUTOS.o_CST, "
      cQuery2   += "'" + o_CST + "', "   
      cQuery1 += "PRODUTOS.CEST, "
      cQuery2   += "'" + RTRIM(CEST) + "', "      
      cQuery1 += "PRODUTOS.FRACIO, "
      cQuery2   += "'" + IIF(FRACIO,"1","0") + "', "   
      cQuery1 += "PRODUTOS.QUEM_BLOQ) "
      cQuery2   += "'" + rtrim(M->OPERADOR)+"/"+rtrim(hwg_GetComputerName()+" ["+dtoc(date())+" "+time()+"]") + "')"   
      ::oServer:Execute(cQuery1+cQuery2)

exemplo de UPDATE
   cQuery1    :="UPDATE PRODUTOS SET "
   IF STRZERO(M->NIV_ACESSO,1,0)$"89"
      cQuery1  +="PRODUTOS.DESPRO = '" + RTRIM(TIRACENTO(upper(DESPRO))) + "', "
   ENDIF
   cQuery1  +="PRODUTOS.EAN13 = '" + LTRIM(STR(EAN13)) + "', "      
   cQuery1  +="PRODUTOS.PROSER = '" + PROSER + "', "   
   IF !EMPTY(CODREF)   
      cQuery1  +="PRODUTOS.CODREF = '" + CODREF + "', "   
   ENDIF      
   cQuery1  +="PRODUTOS.EXTIPI = '" + STRZERO(EXTIPI,3,0) + "', "         
   cQuery1  +="PRODUTOS.GENERO = '" + STRZERO(GENERO,2,0) + "', "      
   cQuery1  +="PRODUTOS.NCM = '" + STRZERO(NCM,8,0) + "', "      
   cQuery1  +="PRODUTOS.TIPUNI = '" + TIPUNI + "', "   
   cQuery1  +="PRODUTOS.ESTMIN = '" + STRZERO(ESTMIN,6,0) + "', "
   cQuery1  +="PRODUTOS.ULPRCUS = '" + STRZERO(ULPRCUS,14,2) + "', "
   if ! empty(DTPRCUS)
      cQuery1  +="PRODUTOS.DTPRCUS = '" +  Hb_DTOC(DTPRCUS, "YYYY-MM-DD")  + "', "
   endif
   cQuery1  +="PRODUTOS.SUBTRIB = '" + STRZERO(SUBTRIB,7,2) + "', "
   cQuery1  +="PRODUTOS.ALIQICMS = '" + STRZERO(ALIQICMS,7,2) + "', "
   cQuery1  +="PRODUTOS.OUTTRIB = '" + STRZERO(OUTTRIB,7,2) + "', "      
   cQuery1  +="PRODUTOS.CUSREAL = '" + STRZERO(CUSREAL,7,2) + "', "   
   cQuery1  +="PRODUTOS.PRECUS = '" + STRZERO(PRECUS,14,2) + "', "         
   cQuery1  +="PRODUTOS.FRETE = '" + STRZERO(FRETE,14,2) + "', "
   cQuery1  +="PRODUTOS.ICMS = '" + STRZERO(ICMS,14,2) + "', "   
   cQuery1  +="PRODUTOS.IPI = '" + STRZERO(IPI,14,2) + "', "   
   cQuery1  +="PRODUTOS.OUTROS = '" + STRZERO(OUTROS,14,2) + "', "   
   cQuery1  +="PRODUTOS.PRECUS = '" + STRZERO(PRECUS,14,2) + "', "      
   cQuery1  +="PRODUTOS.PERLUC = '" + STRZERO(PERLUC,7,5) + "', "
   IF STRZERO(M->NIV_ACESSO,1,0)$"5689"
      cQuery1  +="PRODUTOS.PREVEN = '" + STRZERO(PREVEN,14,4) + "', "      
   ENDIF
   cQuery1  +="PRODUTOS.DATALT = '" + Hb_DTOC(M->DAT_HOJE, "YYYY-MM-DD") + "', "       
   cQuery1  +="PRODUTOS.USUALT = '" + M->OPERADOR + "', "
   cQuery1  +="PRODUTOS.ISS = '" + STRZERO(ISS,5,2) + "', "   
   IF STRZERO(M->NIV_ACESSO,1,0)$"89"
      cQuery1  +="PRODUTOS.ESTATU = '" + STRZERO(ESTATU,10,3) + "', "
      cQuery1  +="PRODUTOS.ESTL02 = '" + STRZERO(ESTL02,10,3) + "', "
   endif
   cQuery1  +="PRODUTOS.n_modBC = '" +  STRZERO(n_modBC,1,0) + "', "   
   cQuery1  +="PRODUTOS.ICMS_CFOP = '" +  STRZERO(ICMS_CFOP,4,0) + "', "
   cQuery1  +="PRODUTOS.ICMS_CFOPI = '" +  STRZERO(ICMS_CFOPI,4,0) + "', "
   cQuery1  +="PRODUTOS.ICMS_CFOJL = '" +  STRZERO(ICMS_CFOJL,4,0) + "', "
   cQuery1  +="PRODUTOS.ICMS_CFOPD = '" +  STRZERO(ICMS_CFOPD,4,0) + "', "      
   cQuery1  +="PRODUTOS.MAXVEN = '" +  STRZERO(MAXVEN,10,2) + "', "   
   cQuery1  +="PRODUTOS.PESO = '" +  STRZERO(PESO,8,3) + "', "
   cQuery1  +="PRODUTOS.ICMS_REGIM = '" + ICMS_REGIM + "', "   
   cQuery1  +="PRODUTOS.ICMS_ST = '" + ICMS_ST + "', "
   cQuery1  +="PRODUTOS.ICMS_ORIGE = '" + ICMS_ORIGE + "', "   
   cQuery1  +="PRODUTOS.q_IPIst = '" +  q_IPIst + "', "   
   cQuery1  +="PRODUTOS.q_IPItc = '" +  q_IPItc + "', "   
   cQuery1  +="PRODUTOS.q_IPIpAli = '" +  STRZERO(q_IPIpAli,5,2) + "', "   
   cQuery1  +="PRODUTOS.q_IPIvAli = '" +  STRZERO(q_IPIvAli,5,2) + "', "   
   if ! empty(o_cEnc)
      cQuery1  +="PRODUTOS.o_cEnc = '" +  o_cEnc + "', "
   else
      cQuery1  +="PRODUTOS.o_cEnc = '999', "
   endif
   cQuery1  +="PRODUTOS.q_PISst = '" +  q_PISst + "', "   
   cQuery1  +="PRODUTOS.q_PIStc = '" +  q_PIStc  + "', "   
   cQuery1  +="PRODUTOS.q_PISpAli = '" +  STRZERO(q_PISpAli,5,2) + "', "   
   cQuery1  +="PRODUTOS.q_PISvAli = '" +  STRZERO(q_PISvAli,5,2) + "', "   
   cQuery1  +="PRODUTOS.s_COFst = '" +  s_COFst + "', "   
   cQuery1  +="PRODUTOS.s_COFtc = '" +  s_COFtc  + "', "      
   cQuery1  +="PRODUTOS.s_COFpAli = '" +  STRZERO(s_COFpAli,5,2) + "', "
   cQuery1  +="PRODUTOS.s_COFvAli = '" +  STRZERO(s_COFvAli,5,2) + "', "
   IF !EMPTY( o_CST)
      cQuery1  +="PRODUTOS.o_CST = '" +  o_CST + "', "
   else
      cQuery1  +="PRODUTOS.o_CST = '00', "
   ENDIF
   IF ! EMPTY(CEST)
      cQuery1  +="PRODUTOS.CEST = '" +  CEST + "', "
   ENDIF
   cQuery1  +="PRODUTOS.FRACIO = '" +  IIF(FRACIO= .T.,'1', '0') + "', "
   cQuery1  +="PRODUTOS.QUEM_BLOQ = '" +  rtrim(M->OPERADOR)+"/"+rtrim(hwg_GetComputerName()+" ["+dtoc(date())+" "+time()+"]") + "' "
   cQuery1 += "WHERE PRODUTOS_ID = '" + nProdutos_Id + "'"
   ::oServer:Execute(cQuery1)   
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

SQL - Dúvidas

Mensagempor leandrolinauer » 20 Fev 2021 12:02

Bom dia Fernando queiroz
Grato pelo retorno.
Bom, de acordo com o seu retorno.

pergunta 1 - se for nulo ou vazio nao grave esquece o campo (no DB defina o PADRAO "null" "0" "auto_increment" "0000-00-00" )
R: Eu fiz uma função para gravar a lista toda de gets, ou seja, se estiver vazio o get ele vai gravar NULL, ok então até aí.

pergunta 2 - relaxa isso não é necessário , o banco de dados se vira com isso
R: Fiz teste com duas aplicações editando o mesmo registro, uma meu sistema outra o SQL Manager Lite, e editei o mesmo campo com valores diferentes no mesmo exato de tempo, o que finalizou por ultimo é que ficou gravado e ai vamos se dizer que na verdade a alteração correta seria a outra, como ficaria estas informações, este é um dilema até grave em sistema em redes.

pergunta 3 - mesma resposta da pergunta 2
R: Blz, realmente efetuei o comando como dito anteriormente e ficou gravado perfeitamente, ai pergunto, se tiver indices a tabela, serão gravadas tbem?

Atenciosamente
Leandro
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 377
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

SQL - Dúvidas

Mensagempor Fernando queiroz » 20 Fev 2021 12:25

pergunta 1 - se for nulo ou vazio nao grave esquece o campo (no DB defina o PADRAO "null" "0" "auto_increment" "0000-00-00" )
R: Eu fiz uma função para gravar a lista toda de gets, ou seja, se estiver vazio o get ele vai gravar NULL, ok então até aí.
eu não gravo toda a lista de Gets pois se tiver NULL ou ESPACOS ou ZEROS , pra que ser gravada ??? ( O DB ja coloca esse valores )
eu vou testando os campos e só coloco o que realmente vai gravar ( menor trafego de informações na rede )
IF ULPRCUS != 0.00
cQuery1 += "PRODUTOS.ULPRCUS, "
cQuery2 += "'" + LTRIM(STR(ULPRCUS,14,2)) + "', "
ENDIF

pergunta 2 - relaxa isso não é necessário , o banco de dados se vira com isso
R: Fiz teste com duas aplicações editando o mesmo registro, uma meu sistema outra o SQL Manager Lite, e editei o mesmo campo com valores diferentes no mesmo exato de tempo, o que finalizou por ultimo é que ficou gravado e ai vamos se dizer que na verdade a alteração correta seria a outra, como ficaria estas informações, este é um dilema até grave em sistema em redes.
Pensando ainda como DBF esquece isso, ( da forma que você está pensando se o cliente travar o registro ninguém mais trabalha

pergunta 3 - mesma resposta da pergunta 2
R: Blz, realmente efetuei o comando como dito anteriormente e ficou gravado perfeitamente, ai pergunto, se tiver indices a tabela, serão gravadas tbem?
Pensando ainda como DBF esquece isso, índices pra que ?? ( tens uma banco enorme que demora muito fazer uma select simples ???
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

SQL - Dúvidas

Mensagempor susviela@bol.com.br » 20 Fev 2021 12:26

Dá uma olhada nesse exemplo simples que postei no meu BLOG a algum tempo.

https://programandoxbase.wordpress.com/2018/09/02/harbour-xbase-com-sqlite/

ou
Aqui no fórum mesmo:

http://www.pctoledo.com.br/forum/viewtopic.php?f=42&t=18480

.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 236
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 153 vezes
Mens.Curtidas: 24 vezes

SQL - Dúvidas

Mensagempor Fernando queiroz » 20 Fev 2021 12:34

um bom curso de SQL ,
https://www.youtube.com/playlist?list=PLHz_AreHm4dkBs-795Dsgvau_ekxg8g1r

da aquele passo inicial , vale a pena fazer
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

SQL - Dúvidas

Mensagempor leandrolinauer » 25 Fev 2021 16:30

Boa tarde a todos.
Desculpe eu teimar em cima do mesmo tema BLOQUEAR REGISTRO em SQL
Pesquisei e achei o comando WITH LOCK para o firebird e confesso fiquei feliz que há como fazer, mas no entanto não obtive exito.

Usar o WITH LOCK na instrução SELECT, li bastante sobre este assunto mas realmente não funcionou.
Pergunto:
Pode ser um problema da versão HB_FBIRD do harbour?
Ou tenho que fazer algum comando diferente para retornar o bloqueio ?

Realmente necessito disto, devido ao problema de dois ou mais usuários usarem o mesmo registro ao mesmo tempo e com este bloqueio realmente a coisa fica mais profissa.
Grato
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 377
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

SQL - Dúvidas

Mensagempor JoséQuintas » 25 Fev 2021 18:10

Eu acho que houve uma precipitação nas respostas.
Gravar vazio - numa alteração, se não gravar um novo valor vazio, o conteúdo anterior vai permanecer
Espaços em branco - não precisa gravar, fica mais rápido inclusive pra leitura, desde que o banco esteja configurado pra não enviar espaços em branco, e suas rotinas peguem os campos e completem o tamanho
Datas - ao contrário de dbf, não existe data zero, é onde geralmente se grava null
null - lógico, a leitura de null é null, não importa se o campo é numérico, caractere ou data
índices - sim, faz muita diferença ter índices, mas ao contrário do que se acostuma com dbfs, índices são pra agilizar pesquisas e não pra um relatório em ordem alfabética, por exemplo.
bloqueio de registros - sim, existe, mas não tem nada a ver com bloqueio em dbf, é pra situações extremas
Existe a opção de definir uma estrutura, incluindo um valor default, por exemplo pra gravar zero quando gravar um registro novo e não informar um campo numérico.
null é nulo, equivalente a NIL.
uma string vazia "" é diferente de null.
zero é diferente de null
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQL - Dúvidas

Mensagempor JoséQuintas » 25 Fev 2021 18:16

novamente nisso de string:
se definiu o campo char(60), ele vai ocupar 60 caracteres SEMPRE.
se definiu o campo varchar(60), ele vai ocupar 0 bytes se gravar "" ou null, na prática nem sei exatamente a diferença com relação a espaço nesse caso, mas com certeza não vão ser 60 caracteres.
E numa pesquisa de 1.000 nomes de clientes, com certeza os espaços em branco vão fazer muita diferença pra velocidade - não se trata de economizar espaço pra gravar, mas sim de ganhar tempo em tudo que é pesquisa, e em todas as transferências entre cliente e servidor.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQL - Dúvidas

Mensagempor leandrolinauer » 26 Fev 2021 08:32

Bom dia Quintas
Bom entendi sobre os espaços, como meus campos foram definidos como varchar(), então estou trabalhando correto com o preenchimento de dados em sql, grato.

Quanto a travar registro, eu acho que realmente é de extrema necessidade devido a anos trabalhando com DBF e usar sempre a função de bloquear o registro para outros não alterarem ao mesmo tempo e já vi ocorrer muito "ficha em uso", pq outro estava alterando os dados, principalmente cadastro de cliente.
Já pensei em uma flag de hora minuto e segundo, para dar um limite de um minuto, assim todo registro com a hora gravada da flag quando acessou o registro, ficaria automaticamente bloqueada para o uso do terminal que acessou, sendo liberada para todos após o tempo decorrido.
Mas se houver um modo diferente de se fazer sem precisar preencher campo de validação, seria melhor, como o width lock que não descobri como funciona.

Grato
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 377
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

SQL - Dúvidas

Mensagempor Mario Mesquita » 05 Mai 2021 11:13

Bom dia a todos.

Pessoal, ainda estudando como fazer as coisas que faço com DBFs em SQL e confesso que a inexperiência pesa nessas horas.

Por isso queria uma dica de como fazer uma operação, aproveitando esse post que é bem meu caso, e que vou descrever de forma hipotética
pra ficar mais fácil de entender:

Imaginem que vocês emplacam veículos. Tipo um convênio com o Detran. Para isso, vcs recebem uma "carga" de placas que podem usar
para emplacar os veículos que surgirem na sua firma.

Entrar com a carga, beleza: pega o alfa, faz um for/next com os numéricos inicial e final fazendo o INSERT na tabela de placas. A princípio,
elas estão todas disponíveis e serão usadas a medida em que chegam veículos a serem emplacados.

Nessa tabela, além da placa, terão outros campos que registrarão alguns dados do veículo emplacado, sendo que na inclusão eles estão em branco.
Significa que se faltam esses dados, essa placa está disponível.

Em DBF, tranquilo: já tenho um índice que posiciona as placas disponíveis, escolho uma pelo menor valor, travo esse registro e gravo os dados do
veículo. Feito assim, garanto que não terão dois veículos com a mesma placa.

Aí vem as minhas dúvidas: qual a melhor forma de fazer isso em SQL? Seria o caso de fazer um SELECT das placas livres, botar num loop e tentar
gravar os dados do veículo em uma delas, evitando as que podem ter sido usadas em outro terminal que pode estar fazendo a mesma coisa?
Ou tem como botar tudo em um comando só? Tipo, manda ele catar uma placa disponível e volta a que ele adquiriu ou volta que não tem nenhuma livre e
tem que pegar uma nova carga de placas com o Detran?

Sei que o SQL é poderoso e deve fazer isso até com facilidade mas estou catando algum exemplo disso e não encontrei. Quem tiver uma dica da forma
segura de fazer isso, desde já agradeço.

Saudações,
Mario
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 9 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro