Clipper On Line • Ver Tópico - Relacionamentos em MySql

Relacionamentos em MySql

Discussão sobre SQL

Moderador: Moderadores

 

Relacionamentos em MySql

Mensagempor Marcos » 12 Nov 2018 16:02

Como poderei criar o relacionamento entre tabelas direto via código (PRG), pois no inicio do sistema tenho uma função que cria as tabelas e o banco de dados, porém não estou conseguindo inserir o código para a criação de Chaves-Estrangeiras, segue o código que tenho:

* cidades
if ascan(aTabelasExistentes,lower('cidades')) != 0
else
  cQuery := 'CREATE TABLE cidades (id INT UNSIGNED NOT NULL AUTO_INCREMENT,'+;
   'codigo INT,'+;
   'municipio VARCHAR(50),'+;
   'uf CHAR(2),'+;   
  'data_cad date,'+;
  'hora_cad char(08),'+;
  'PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8'
  oQuery := oServer:Query(cQuery)
  if oServer:NetErr()
        msginfo('Erro criando tabela : cidades : '+oServer:Error(),'Atenção')
        form_main.release
   endif
   oQuery:Destroy()
endif
* empresas
if ascan(aTabelasExistentes,lower('empresas')) != 0
else
  cQuery := 'CREATE TABLE empresas (id INT UNSIGNED NOT NULL AUTO_INCREMENT,'+;
   'NOME VARCHAR(50),'+;
   'CGC CHAR(18),'+;
   'FANTASIA VARCHAR(50),'+;
   'TELEFONE CHAR(11),'+;
   'ID_CIDADE INT,'+;
  'data_cad date,'+;
  'hora_cad char(08),'+;
  'PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8'
  oQuery := oServer:Query(cQuery)
  if oServer:NetErr()
        msginfo('Erro criando tabela : empresas : '+oServer:Error(),'Atenção')
        form_main.release
   endif
   oQuery:Destroy()
endif

Na tabela de Empresas tem o 'ID_CIDADE' que deverá se relacionar com 'ID' da tabela de Cidades. O código acima está funcionando, porém somente cria as tabelas, não tem relacionamento algum, alguém pode me ajudar?
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar de usuário

Marcos
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 20 Set 2003 09:16
Cidade/Estado: Cáceres/Mato Grosso
Curtiu: 6 vezes
Mens.Curtidas: 1 vez

Relacionamentos em MySql

Mensagempor susviela@bol.com.br » 12 Nov 2018 17:19

.

O comando que faz isso é o ALTER TABLE

https://mariadb.com/kb/en/library/alter-table/

Por exemplo:

ALTER TABLE produto ADD CONSTRAINT fk_idfornecedor FOREIGN KEY (idfornecedor)
REFERENCES fornecedor (idfornecedor)

Só colocar esse texto em uma string e executar a query se não der erro seu relacionamento está criado.

------

Aqui nesse link está melhor ainda:

https://mariadb.com/kb/en/library/constraint/
.
.
"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: 156
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 77 vezes
Mens.Curtidas: 14 vezes

Relacionamentos em MySql

Mensagempor susviela@bol.com.br » 12 Nov 2018 17:39

Você vai precisar ter um certo cuidado com esse item:

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]


reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION

Inicialmente se vc não manja de "integridade referencial" pode usar:

ON DELETE NO ACTION
ON UPDATE NO ACTION

Mas essa não é a melhor opção
.
.
"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: 156
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 77 vezes
Mens.Curtidas: 14 vezes

Relacionamentos em MySql

Mensagempor Marcos » 12 Nov 2018 18:05

Susviela, preciso somente adicionar as linhas de relacionamento entre a tabela Empresas e a Tabela Cidades no exemplo que citei.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar de usuário

Marcos
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 20 Set 2003 09:16
Cidade/Estado: Cáceres/Mato Grosso
Curtiu: 6 vezes
Mens.Curtidas: 1 vez

Relacionamentos em MySql

Mensagempor susviela@bol.com.br » 12 Nov 2018 18:53

.

Mais ou menos isso ...


  cQuery := ' ALTER TABLE empresas ADD CONSTRAINT fk_idcidade FOREIGN KEY (idcidade)
    REFERENCES cidades (id)  '
  oQuery := oServer:Query(cQuery)
  if oServer:NetErr()
        msginfo('Erro criando relacionamento  : '+oServer:Error(),'Atenção')
        form_main.release
   endif
   oQuery:Destroy()



O melhor e você entender como isso funciona
.
.
"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: 156
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 77 vezes
Mens.Curtidas: 14 vezes

Relacionamentos em MySql

Mensagempor Marcos » 13 Nov 2018 07:22

Bom dia Susviela, problema resolvido obrigado pela paciência e sabedoria.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar de usuário

Marcos
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 20 Set 2003 09:16
Cidade/Estado: Cáceres/Mato Grosso
Curtiu: 6 vezes
Mens.Curtidas: 1 vez

Relacionamentos em MySql

Mensagempor Marcos » 13 Nov 2018 08:07

Susviela, para o relacionamento dar certo os campos de Cidades (id) e Empresas (id_cidades) devem estar como KEY, como criar as tabelas já com os campos KEY marcado ?
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar de usuário

Marcos
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 20 Set 2003 09:16
Cidade/Estado: Cáceres/Mato Grosso
Curtiu: 6 vezes
Mens.Curtidas: 1 vez

Relacionamentos em MySql

Mensagempor susviela@bol.com.br » 13 Nov 2018 10:33

Marcos escreveu:Susviela, para o relacionamento dar certo os campos de Cidades (id) e Empresas (id_cidades) devem estar como KEY, como criar as tabelas já com os campos KEY marcado ?


Então se liga em uma coisa ... o ; (ponto e virgula terminam uma linha em SQL ) o que impede de você colocar mais de comando na linha no seu string ?

cSql := "create table teste .... ;           " +;
            "ALTE TABLE teste .... ;        " +;
            "INSERT INTO teste  .... ;    "

e executar a Query ...

Obs: "o que impede..." na verdade se der um erro no SQL vai um pouco mais difícil de encontrar, só isso.

Tá mas... e se eu criar um arquivo texto com todos os comando e executar esses comando de uma só vez, seria uma ótima ideia ? As possibilidades são infinitas ... vai da criatividade do programador.

Mas é isso ai .. vamos subindo a escada aos poucos, degrau por degrau....
.
.
"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: 156
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 77 vezes
Mens.Curtidas: 14 vezes

Relacionamentos em MySql

Mensagempor dbsh » 16 Nov 2018 00:30

Exemplo de relacionamento sem mudar a estrutura do banco de dado
Neste exemplo retornara os valores por tipo de pagamento, por impressora, por data

CAMPOS RETORNADOS:
ACUMULADO,IMPRESSORA,TIPO_PGTO,TOTAL,RECEBIDO,TROCO,SANGRIA,SUPRIMENTO, M.*

DETALHANDO:
V.* - VENDA_CABECALHO - Contém o financeiro das vendas e dados do cliente
M.* - MOVIMENTO - Contém Identificação dos fechamento, pode ser feito mais de um fechamento por dia
TP.* - TOTAL_TIPO_PGTO - Contém as formas de pagamento "parcelas", de cada Cupom Fiscal
P.* - TIPO_PAGAMENTO - Tabela com as formas de pagamento

Poderia colocar Sangria e Suprimento como LEFT JOIN, para efeito didático quis demonstrar como criar uma coluna com outro SELECT
M.* Retorna todos campos da tabela Movimento
Coalesce - Evita que retorne campo NULL
LEFT JOIN - Cria relacionamento e os campos que não tiver valores relacionado na tabela, retorna NULL, retorna toda tabela de acordo com o filtro na clausula WHERE, evitando que a linha toda, "REGISTRO" seja omitida, caso se use INNER JOIN

select v.DATA_VENDA AS ACUMULADO,m.ID_IMPRESSORA,p.DESCRICAO AS TIPO_PGTO,
COALESCE(sum(tp.VALOR), 0) - COALESCE(sum(v.troco),0) AS TOTAL,
COALESCE(sum(v.valor_recebido),0) AS RECEBIDO,
COALESCE(sum(v.troco),0) AS TROCO,
(select sum(valor) from sangria sg where m.id=sg.id_movimento AND sg.id_impressora=m.id_impressora AND sg.id_tipo_pagamento=p.id) as sangria,
(select sum(valor) from suprimento sp where m.id=sp.id_movimento  AND sp.id_impressora=m.id_impressora AND sg.id_tipo_pagamento=p.id) as suprimento,
m.*
from venda_cabecalho v
LEFT JOIN movimento m ON (v.ID_MOVIMENTO = m.ID)
LEFT JOIN total_tipo_pgto tp ON (v.ID = tp.ID_VENDA_CABECALHO)
LEFT JOIN tipo_pagamento p ON (tp.ID_TIPO_PAGAMENTO = p.ID)
WHERE V.STATUS_VENDA <> 'C' AND v.DATA_VENDA BETWEEN '2018-11-01' AND '2018-11-31'
GROUP BY v.DATA_VENDA,m.ID_IMPRESSORA,p.id
ORDER BY v.DATA_VENDA,m.ID_IMPRESSORA,p.descricao
010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
Avatar de usuário

dbsh
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 69
Data de registro: 14 Jul 2004 14:19
Cidade/Estado: ES
Curtiu: 2 vezes
Mens.Curtidas: 9 vezes

Relacionamentos em MySql

Mensagempor susviela@bol.com.br » 16 Nov 2018 08:50

dbsh escreveu:Exemplo de relacionamento sem mudar a estrutura do banco de dado


Muito boa dica, essa é uma opção temporária usando sub select, obtendo o resultado, mas o questionamento do colega me pareceu que tinha por objetivo um relacionamento permanente, inclusive com recursos de integridade referencial pois ele comentou acima "qual a vantagem de usar banco de dados então ...".

Ai está pelo menos duas vantagens (relacionamento permanente e a sua contribuição relacionamento temporário ) ente outras "centenas" de vantagens que ele vai acabar descobrindo com o uso de SGBDs.
.
.
"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: 156
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 77 vezes
Mens.Curtidas: 14 vezes

Anterior



Retornar para SQL

Quem está online

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


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
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro