SQL - Dúvidas

Forum sobre SQL.

Moderador: Moderadores

leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

SQL - Dúvidas

Mensagem por leandrolinauer »

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.

Código: Selecionar todos

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)
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

SQL - Dúvidas

Mensagem por Fernando queiroz »

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

Código: Selecionar todos

		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

Código: Selecionar todos

	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
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

SQL - Dúvidas

Mensagem por leandrolinauer »

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)
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

SQL - Dúvidas

Mensagem por Fernando queiroz »

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
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

SQL - Dúvidas

Mensagem por susviela@bol.com.br »

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

https://programandoxbase.wordpress.com/ ... om-sqlite/

ou
Aqui no fórum mesmo:

https://pctoledo.org/forum/viewto ... 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 )
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

SQL - Dúvidas

Mensagem por Fernando queiroz »

um bom curso de SQL ,
https://www.youtube.com/playlist?list=P ... u_ekxg8g1r

da aquele passo inicial , vale a pena fazer
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

SQL - Dúvidas

Mensagem por leandrolinauer »

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)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

SQL - Dúvidas

Mensagem por JoséQuintas »

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 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

SQL - Dúvidas

Mensagem por JoséQuintas »

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 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/
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

SQL - Dúvidas

Mensagem por leandrolinauer »

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)
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

SQL - Dúvidas

Mensagem por Mario Mesquita »

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
Responder