Página 2 de 2

Relacionamentos em MySql

Enviado: 12 Nov 2018 17:02
por Marcos
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:

Código: Selecionar todos

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

Relacionamentos em MySql

Enviado: 12 Nov 2018 18:19
por susviela@bol.com.br
.

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/

Relacionamentos em MySql

Enviado: 12 Nov 2018 18:39
por susviela@bol.com.br
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

Relacionamentos em MySql

Enviado: 12 Nov 2018 19:05
por Marcos
Susviela, preciso somente adicionar as linhas de relacionamento entre a tabela Empresas e a Tabela Cidades no exemplo que citei.

Relacionamentos em MySql

Enviado: 12 Nov 2018 19:53
por susviela@bol.com.br
.

Mais ou menos isso ...

Código: Selecionar todos



  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

Relacionamentos em MySql

Enviado: 13 Nov 2018 08:22
por Marcos
Bom dia Susviela, problema resolvido obrigado pela paciência e sabedoria.

Relacionamentos em MySql

Enviado: 13 Nov 2018 09:07
por Marcos
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 ?

Relacionamentos em MySql

Enviado: 13 Nov 2018 11:33
por susviela@bol.com.br
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 ?

Código: Selecionar todos

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

Relacionamentos em MySql

Enviado: 16 Nov 2018 01:30
por dbsh
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

Código: Selecionar todos

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

Relacionamentos em MySql

Enviado: 16 Nov 2018 09:50
por susviela@bol.com.br
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.