Clipper On Line • Ver Tópico - SQLMIX SELECT de nomes com valores vazios

SQLMIX SELECT de nomes com valores vazios

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

SQLMIX SELECT de nomes com valores vazios

Mensagempor janio » 24 Jun 2015 09:28

Karine,

So lembrando que a coluna IS_DELETED é um controle interno do Mediator. Se vc pretende usar SQLMIX, não precisa fazer sempre referencia a esse campo, ok?

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor JoséQuintas » 24 Jun 2015 12:46

O MySQL não permite alterar o default pra NOT NULL caso exista algum registro já gravado com conteúdo NULL.

Considerações:

No passado também tentei resolver essa questão do nulo com apenas NOT NULL, mas gerou novos problemas.
Campo TEXT, equivalente ao MEMO, não pode definir como NOT NULL.
Campo DATE, caso defina como NOT NULL, não consegue gravar data em branco, pois MySQL deixou de aceitar "0000-00-00" pra ficar no padrão de outros "SQL", e só restou deixar com NULL.
Pra campos NUMERIC/DOUBLE/INT e CHAR, além de definir como NOT NULL, precisa definir um valor default.

Aonde isso faz falta:
Supondo que sejam definidos 3 campos: CODIGO, NOME, ENDERECO, os três com NOT NULL.
Ao fazer INSERT INTO TABELA ( CODIGO ) VALUES ( 1 ), isso vai dar erro.
Porque?
Foi definido pra não aceitar nulo, portanto não pode deixar NOME e ENDERECO vazios.
Pra não ter que colocar a lista de campos com valor default, mais fácil definir um default no MySQL.

Mesmo assim, resta o campo TEXT que não pode ser definido como NOT NULL, e também o DATE que não aceita data zerada.

Nota:
Antes de definir um campo em uma base já existente pra NOT NULL é necessário que o campo não contenha NULL em nenhum registro.
Essa questão pode ser resolvida primeiro gravando o default nos registros já existentes.
UPDATE TABELA SET NOME='' WHERE NOME=NULL
Depois disso vai poder definir como NOT NULL e definir um valor default.
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor JoséQuintas » 24 Jun 2015 13:18

dbUseArea( .T., , "SELECT code, ifnull(name,space(35)) as Nome, residents FROM country", "country" )
Browse()


Não sei se foi erro de digitação, mas talvez tenha funcionado porque usou NAME e NOME.

Testei aqui, e uma alternativa seria "deixar o campo de fora".
Usei uma fórmula. Como é usada fórmula, dá pra escolher qualquer nome para o resultado, até o nome do campo.
Testei num arquivo que tinha aqui disponível, então tive que ajustar o comando pra ele.

SELECT IF( IISNULL( NOME ), 'EM BRANCO', NOME ) AS NOME FROM CORRENTE ORDER BY NOME DESC LIMIT 10


Lembrei de outra questão:
Se não me engano, no MySQL 3.0 não aceita usar AS, basta o nome. (SELECT SUM(VALOR) SOMA).
O AS veio depois, pra deixar padronizado com outras bases de dados.

Nota: A versão 3.0 é de alguns anos atrás, mas se a base vém desde aquela época, pode estar usando essa.
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor alxsts » 24 Jun 2015 13:32

Olá!

JoséQuintas escreveu:Campo DATE, caso defina como NOT NULL, não consegue gravar data em branco, pois MySQL deixou de aceitar "0000-00-00" pra ficar no padrão de outros "SQL", e só restou deixar com NULL.

Não creio que isto seja verdade. O Exemplo abaixo é em um servidor MariaDB e creio que o comportamento seja idêntico no MySQL:

Forum.PNG
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor JoséQuintas » 24 Jun 2015 16:44

Quando comecei com MySQL, muitos anos atrás, aceitava isso normalmente, acho que era 3.0.
Até achei bom por ser igual no Clipper.
No SQLServer e Access isso não era possível.

Tempos depois, quando troquei de versão, não aceitava mais.

A princípio, pesquisei na internet, encontrei referência a "STRICT MODE".

Alterando isso, pude gravar data zerada, e deixar como default "0000-00-00".

Mas depois, começou a acusar erro no SELECT, não lembro exatamente a mensagem de erro, algo como "too many recyclic operations".
Chutei se tratar de data zerada, voltei a retirar o default, e trocar todas as zeradas no banco por NULO.
Aí voltou tudo ao normal.

Desde essa data, deixei de usar data zerada.

Convém fazer uns testes pra não ter surpresas depois, com pesquisas que usem esses registros e essas datas zeradas.

Importante: Acusava o erro mesmo no HeidiSQL, então não tem nada a ver com o uso do aplicativo.
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor JoséQuintas » 24 Jun 2015 17:30

Dei uma pesquisada novamente sobre isso:

The server requires that month and day values be legal, and not merely in the range 1 to 12 and 1 to 31, respectively. With strict mode disabled, invalid dates such as '2004-04-31' are converted to '0000-00-00' and a warning is generated. With strict mode enabled, invalid dates generate an error


http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html

Foi essa opção que tentei como alternativa na época.
Mas aparentemente não resolveu por completo.

Por isso acabei usando NULL, que dispensa configurações especiais, não causa surpresas, e funciona em qualquer um.

Também tive surpresas com o parâmetro LOWER_CASE_TABLE_NAMES
Parece que nos dois casos, a mudança foi parcial. ( Este último se refere a nomes de tabelas usando maiúsculas/minúsculas)

Mas se olhar a descrição, até deixa dúvidas:

O servidor necessita que mês e dia sejam valores válidos, e não apenas no intervalo 1 a 12 e 1 a 31.
Por exemplo "2004/04/31" é convertida pra "0000-00-00" e é emitido alerta. Se STRICT MODE está ativo, datas inválidas geram erro.

Pela descrição, em qualquer das opções continua sendo validado 1 a 12, e 1 a 31, então zero não vale.
Na dúvida, e após ter erro, a única certeza é que NULL funciona.
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor Itamar M. Lins Jr. » 24 Jun 2015 18:35

Não sei se foi erro de digitação, mas talvez tenha funcionado porque usou NAME e NOME.

Não foi erro nenhum, tanto é que funciona.
O nome do FIELD é NAME o alias é NOME procure ai no google sobre select com alias... Porque se não o SQLMIX vair trazer a sentença com cabeçalho OK!!!!
O CABEÇALHO FICARÁ assim "ifnull(name,space(35))"... ou o nome da estrutura do DBF.
Sobre o campo data também vejo que não tem nada a ver, aqui aceitou a data... conforme explica a nota em inglês!!!! Está trocando alhos com bugalhos.
A nota diz que se usarmos a data ERRADA, tipo 31/02/2000, será colocado 0000-00-00, com STRICT MODE vai gerar um erro e não vai colocar 0000-00-00.
pois MySQL deixou de aceitar "0000-00-00"
O seu MySQL rsrsrsrs! Como é que a nota diz uma coisa e vc diz outra ?

Vai ver é um bug do ADO!

Porque aqui a data funcionou com 0000-00-00, mesmo com not null
   ? rddInfo( RDDI_EXECUTE, "CREATE TABLE country (CODE char(3), NAME char(50), RESIDENTS int(11), NASCIDO datetime not null )" )

"INSERT INTO country values ('LTU', 'Lithuania', 3369600, '"+xDT+"'), ('USA', 'United States of America', 305397000, '0000-00-00'),...


Aqui foi tranquilo.
dbUseArea( .T., , "SELECT code, ifnull(name,space(35)) as Nome, residents, nascido FROM country", "country" )


Vai ter que entrar em contato com a Micro$oft p/ corrigir o ADO ;-)

Saudações,
Itamar M. Lins Jr.
Anexos
sqlmix2.png
sqlmix1.png
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor Itamar M. Lins Jr. » 24 Jun 2015 18:49

E lá vamos nós para uma discussão que não te nada a ver com o tópico...

O tópico é select de NOMES (caractere) e não select de DATA!!! ou como trabalhar com DATAS no MySQL... é melhor abrir outro tópico!

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor JoséQuintas » 24 Jun 2015 20:05

Enquanto você continuar um grande cabeça dura, vai ser difícil.


Vamos por partes:

1)
No SELECT apresentado com erro, é usado o campo NOME.
Não apresentou uma solução para o problema, apenas mostrou um select com NAME, portanto usou um nome de campo diferente do problema, que não serve como solução.

2)
A questão apresentada foi sobre NULL
O campo NULL afeta todos os tipos de campos, e não apenas string.
Por isso citei todos os tipos, incluindo o DATE

3)
Após meu post, veio a pergunta sobre o DATE, e por isso respondi.

Fui bem claro que foi digitando no HeidiSQL.
Você errou no nome do campo.
Também errou ao sugerir definir o campo pra não aceitar nulo.
Também errou no último post, e como sempre desviou o assunto pra ADO.

Entendeu que só você continua errando?

Ainda tentei aliviar dizendo que poderia se tratar de erro digitação, mas ficou tão preocupado com outras coisas fora do assunto, que confirmou o erro.
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor JoséQuintas » 24 Jun 2015 20:20

Lembrei de uma coisa, que acaba relacionada ao assunto:
Quando falei de usar MySQL, você rebateu com longos textos dizendo que MariaDB era bem melhor.
Realmente testou em MySQL?
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor Itamar M. Lins Jr. » 24 Jun 2015 20:24

Ola!
Cadê o erro ?
Eu estou usando um exemplo teste do Viktor Szakats....
Não tem erro nenhum... NAME é NAME mesmo em inglês e eu coloque o ALIAS em português NOME , na select fica assim NAME as NOME...
Será que terei que desenhar ?
portanto usou um nome de campo diferente do problema, que não serve como solução.

Mas como criatura? se está funcionando ? Como vc é prepotente! só tem MySQL em seu computador ? Eu estou fazendo tudo aqui no MEU COMPUTADOR e com MYSQL 5.6 E SQLMIX e está funcionando, como vc afirma que não está funcionando ? Está louco ?

Não tem nada errado, Não está errado sugerir em não aceitar nulo, o problema é o tamanho da STRING afff! Deixe de ser prepotente...
O MySQL aceita da data '0000-00-00' aff... é muita chatice viu!!!

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor Itamar M. Lins Jr. » 24 Jun 2015 20:37

VEJA AQUI OHH SENHOR PREPOTÊNCIA!!!
Troque por:

DBUSEAREA( .T., 'SQLMIX', "SELECT codigo,IfNull(nome, Space(35)) as nome FROM GRUPOS where IS_DELETED='N' order by nome ","Nome_Do_DBF" )

CADÊ NAME ai em cima????

Na QUERY da moça eu coloquei ifnull(NOME,space(35)) AS NOME tá vendo ?????
No meu exemplo de teste eu coloquei ifnull(NAME,space(35)) AS NOME !!! não tem erro nenhum. Na versão do MySQL que ela usa ou do SQLMIX pode não está aceitando a sintaxe "AS"... Ok ohh grande mestre!!!

AQUI está funcionando tudo sem problema nenhum usando "as" para dar nome ao ALIAS e 0000-00-00 na data OK senhor prepotência! É MYSQL não é MariaDB não.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor Itamar M. Lins Jr. » 24 Jun 2015 20:46

Leia novamente senhor!!!
Itamar eu tentei o "as"

funcionou com isso: sem o 'as"

DBUSEAREA( .T., 'SQLMIX', "SELECT codigo,IFNULL(nome,space(35)) nome FROM GRUPOS; " )

obrigada a todos!


Tá vendo ?
Ela tirou o "AS"... Aqui com AS funciona!!!

Lique p/ a M$ para reportar o BUG do ADO que não aceita a data '0000-00-00'! Ou melhor passe a usar o SQLMIX.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor JoséQuintas » 25 Jun 2015 01:51

Realmente.
Tá explicado porque tanta poluição.
Conseguiu.
Parabéns.
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: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SQLMIX SELECT de nomes com valores vazios

Mensagempor Itamar M. Lins Jr. » 25 Jun 2015 09:05

Ola!
Bobo vc não é, ou é ?

http://www.w3schools.com/sql/sql_alias.asp
SQL Alias Syntax for Columns
SELECT column_name AS alias_name
FROM table_name;


https://dev.mysql.com/doc/refman/5.0/en/select.html
A select_expr can be given an alias using AS alias_name. The alias is used as the expression's column name and can be used in GROUP BY, ORDER BY, or HAVING clauses. For example:

SELECT CONCAT(last_name,', ',first_name) AS full_name
FROM mytable ORDER BY full_name;


The AS keyword is optional when aliasing a select_expr with an identifier. The preceding example could have been written like this:

SELECT CONCAT(last_name,', ',first_name) full_name
FROM mytable ORDER BY full_name;

However, because the AS is optional, a subtle problem can occur if you forget the comma between two select_expr expressions: MySQL interprets the second as an alias name. For example, in the following statement, columnb is treated as an alias name:

SELECT columna columnb FROM mytable;


For this reason, it is good practice to be in the habit of using AS explicitly when specifying column aliases.

It is not permissible to refer to a column alias in a WHERE clause, because the column value might not yet be determined when the WHERE clause is executed. See Section B.5.5.4, “Problems with Column Aliases”.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

Anterior Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 13 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