Delphi

16 отговора 307 прегледа
#1

Delphi

Здравейте на всички! Искам да попитам за някои неща относно програмирането с Delphi. Та така аз правя една програма с Delphi а базата с данни ми е на MS SQL Server. Въпросите ми са:
1. Как да направя така че като въвеждам данни те да се записват в всички таблици където трябва да ги има.Сега съм го направила с View на сървъра и с ADOTable в делфи но като въведа данни те се записват само в таблиците които съставят view a в другите не се записвати остават като нулеви стойности.
2. Как да направя така че всички таблици които използвам да се свързват с един conection string a не на всяка по отделно да посочвам пътя с conection string .Казаха ми че ставало чрез datamodule или нещо подобно но не ми обясниха точно как.
Ще съм много благодарна, ако някои ми помогне и мерси предварително!!!

Отговор
в отговор на frezia19 #2

Re: Delphi

Ако имаш данни, които трябва да въвеждаш и да са еднакви във всички (или в няколко) таблици, значи базата ти е зле проектирана.
А иначе записването на данни става например с
insert into tblname (field1,...) values .....

Отговор
в отговор на frezia19 #3

Re: Delphi

напиши си няколко triggers....before insert, after insert .... и т.н....

Отговор
в отговор на frezia19 #4

Re: Delphi

За да се отговори коректно на първия въпрос трябва да се знае структурата на базата - таблици и връзките между тях. Така че ако искаш да ти се помогне, можеш да публикуваш някъде поне realtionship-а (графичната схема на таблиците и връзките)
За втория въпрос нещата са ясни - връзката към базата се прави с един ADOConnection, а този ADOConnection го посочваш в свойството Connection на всеки ADOTable.

чети и дишай по-леко
Отговор
в отговор на frezia19 #5

Re: Delphi

Ами относно свързването с една конекция направих един datamodule с ADOconection след това на всички форми където има таблици давам UseUnit-> datamodule и на conection посочвам ADOconection от datamodula. Дотук всичко е ок защото в гридовете се показва нужната информация но при компилиране на целия проект дава грешка и казва че няма връзка с базата. Може би пропускам нещо, дали не трябва за всяка отделна таблица да се пише сорс допълнително и се уточнява че се използва модул???
А колкото за първото имам 4 таблици:
табл.1 съдържа ЕГН, Име, Номер на лична карта
табл.2 - ЕГН, град, улица, тел.....
табл.3 - ЕГН, ЕГН на съпруг/а, име на съпруг/а
табл.4 - ЕГН, ЕГН на дете, име на дете
таблиците са свързани по егн-то
това не целия проект но сега го пиша по памет защото не е пред мен примерно да кажем че е това. Аз съм направила едно View кадето съм взела егн от първата таблица и когато въвеждам нов клиент егн-то се записва само там а в останалите го няма.Сега използвам за въвеждане навигатор а може би трябва да е чрез бутон и на него да се пише сорс че текста от всеки ДБЕдит да се записва в всички таблици където трябва.
Като цяла аз не съм много наясно с делфи и особено със сорсовете. Ще съм много благодарна, ако някои ми помогне с някакъв примерен сорс!

Отговор
в отговор на frezia19 #6

Re: Delphi

Ами проблема е точно в проектирането на таблиците.
Ето как трябва да бъде:
табл.1 ID, ЕГН, Име, Номер на лична карта
табл.2 - ID, град, улица, тел.....
табл.3 - ID, ЕГН на съпруг/а, име на съпруг/а
табл.4 - ID, ЕГН на дете, име на дете
това ID се нарича в първата таблица primary key, или главен ключ, а в другите таблици - foreign key. Идеята е че то се генерира само в табл. 1, а в другите го създаваш сам. Така това ЕГН ще се попълва и обработва само на едно място и проблемите ти ще изчезнат.
По принцип проектирането на бази данни си е отделна наука, така че ако няма кой да разработи базата свиркай. Междувременно ще се огледам да ти пратя подходяща литература.

чети и дишай по-леко
Отговор
в отговор на frezia19 #7

Re: Delphi

Мда, трябва да си оправиш базата. Потърси в нета ръководство за SQL или виж на Славейков за книжките "Проектиране на бази данни" или "Mastеring SQL", където се описва доста подробно как трябва да се структурира една база.

Mixy
Отговор
в отговор на NDeu #8

Re: Delphi

Къде да запиша stored procedure и после как да я извикам.
Помощ. Нищо не разбирам. Покажете ми само основните неща, а не как се пише сама та процеда. Въобще искам да се науча на най-добрия (производителен начин) за изпълнение на един мощен сървер от страна на клиенти с слаби машини.

Админ. защо не могада създавам нови теми.
Ако си ми забранил се махам от този форум и повече няма да те безпокоя.
Виж оправи проблема.
фром "HI"

Отговор
в отговор на Mixy #9

Re: Delphi

незабравяй да използваш защита за транзакция...
Много важно и основно нещо.
Хайде някой мастер да ни покажи :)

Админ позволи ми да създавам нови теми.

Отговор
в отговор на hi #10

Re: Delphi

Нови теми се създават като се отиде в съответния клуб и избереш иконката за нова тема - най-лявата от списъка с икони до името на клуба.
"Защита за транзакция" е интересен термин, но много неориентиран. Ако питането е как да се ползват транзакциите за защита на данните, направи нова тема и съм сигурен че много хора ще откликнат.

чети и дишай по-леко
Отговор
в отговор на Pechenia #11

Re: Delphi

Здр, не мисля че проблема е проектирането на базата. Аз се занимавам по подробно с проектиране и нормализиране на бази от данни и смея да твърдя че базата е проектирана мн добре. Тези идентификатори ги имам но съм пропуснала да ги напиша предния път.
Те са от тип autonumber и са първични ключове, а ЕГН е първичен ключ само в първата таблица а в другите е чужд ключ и чрез него се прави връзка между таблиците. Проблема е че съм на вие с Delphi и не мога да направя системата така както искам. За момента написах няколко тригера и се надявам да стане с тях :)
Блогодаря за съветите!!!

Отговор
в отговор на frezia19 #12

Re: Delphi

Може би тогава ти трябва master-detail връзка. Погледни примера на [линк]
Ако и това не ти свърши работа, добре е да направиш един screenshot на интерфейса и да го сложиш някъде, за да можем да ти дадем съвет с кои компоненти и как да свържеш нещата.

чети и дишай по-леко
Отговор
в отговор на frezia19 #13

Re: Delphi

Ако си направила базата от данни както трябва (типична свездообразна схема , която най-вероятно ще се използва за справки) със съответните index, key, relationship то в Delphi нещата са лесни.
1. Във View-то което си конструирала покажи полето ЕГН от всички таблици.
2. В Dephi слагаш ADOCommand и свъзваш свойството Connection. В CommandText пишеш insert-a :
INSERT INTO VIEW (EGN1,EGN2 .... ) VALUES (:EGN1,:EGN2....)
Където изреждаш всички полета ЕГН от всички таблици и разбира се останалите които искаш да попълниш.
Дуеточието (:) пред :EGN1 ... показва, че това са параметри.
3. Във формата слагаш edit контроли (TEdit) за въвеждане на данните и бутон.
4. В OnClick събитието на бутона слагаш следния код:

ADOCommand1.Parameters.ParamValues['EGN1;EGN2....']:=VarArrayOf([Edit1.text,Edit1.text....]); /подаваш стойности на параметрите/
ADOCommand1.Execute; /изпъняваш/

Разбира се , че може да пишеш тригери или запазени процедури, но за такава проста манипулация не си заслужава.
Успех.

Отговор
в отговор на frezia19 #14

Re: Delphi

Направих го както ADO е предложил и всичко е наред до момента в който започвам да въвеждам данни. При натискане на бутона ми излиза съобщение за грешка, пише че ЕГН2, ЕГН3 са невалидни параметри и нищо не се въвежда в таблиците. Явно пропускам нещо но незнам къде бъркам. Сега ще опиша нещата по точно. Та значи таблиците съдържат следната информация:
1.Клиенти ( ЕГНК, ЛК№, ИмеК, ДИЛК, ИМВР )
2.Адреси ( ID, ЕГНК, Ул, ПК, Град, Тел, СП, Деца, РБТ, ЕГНС )
3.Молби ( Вх.№, ЕГНК, ДПМ, Доход, Размер, НПП, ДОП, КодП )
4.Съпрузи ( ЕГНС, ИмеС )
5.Деца ( ID, ЕГНК, ИмеД, ЕГНД )
6.Социални работници ( Ул, СР )
7.Решения ( ID, ЕГНК, ДПМ, Реш )
8.Помощи ( ID, ЕГНК, КодП, ВидП, ЗООП, Срок )
ЕГН на клиента (ЕГНК) е чужд ключ почти във всички релации но чрез него се прави връзка между таблиците.
Във формата на Delphi трябва да въведа следните данни:
ЕГНК в таблиците Клиенти, адреси, деца;(ЕГНК в останалите таблици се въвежда в друга форма)
ЕГНС в таблиците адреси и съпрузи;
Ул в табл. адреси и соц. Работници
Това са проблемните данни другите се въвеждат само в една таблица и там няма проблем.
До момента съм направила следното:
В CommandText на ADOCommand съм написала:
insert into Registraciq1(така се казва view)
(EGNK, ImeK, LKN, DILK, IMVR, EGNK2, PK, Grad, Tel,S P, Deca, RBT, EGNS, Ul1, EGNK3, EGND, ImeD, SR, Ul, EGNS2, ImeS) values (:EGNK,:ImeK,:LKN,:DILK,:IMVR,:EGNK2,:PK,:Grad,:Tel,:SP,:Deca,:RBT, :EGNS,:Ul,:EGNK, :EGND, :ImeD,:SR, :Ul,:EGNS2, :ImeS)
на on click на бутона е следното:
procedure TForm5.Button3Click(Sender: TObject);
begin
if (DBEdit13.text='1')then
begin
DataModule24.ADOCommand1.Parameters.ParamValues['EGNK; EGNK2; EGNK3; ImeK; LKN; DILK; IMVR; PK; Grad; Tel; SP; Deca; RBT; ImeS; EGND; ImeD; EGNS; SR; EGNS2; Ul; Ul']:= VarArrayof
( [ DBEdit1.Text, DBEdit1.Text, DBEdit1.Text, DBEdit5.Text, DBEdit2.Text, DBEdit3.Text, DBEdit4.Text, DBEdit6.Text, DBEdit7.Text, DBEdit10.Text,
DBComboBox1.Text, DBEdit9.Text, DBComboBox2.Text, DBEdit12.Text, DBEdit14.Text, DBEdit20.Text, DBEdit11.Text, DBEdit13.Text, DBEdit11.Text,
DBEdit8.Text, DBEdit8.Text]);
DataModule24.ADOCommand1.Execute;
end
else if (DBEdit13.text<>'1')then
messageDlg('Грешен номер',mtError,[mbok],0)

А това е SQL кода на view-то:
SELECT TOP 100 PERCENT dbo.Klienti.EGNK, dbo.Klienti.ImeK, dbo.Klienti.LKN, dbo.Klienti.DILK, dbo.Klienti.IMVR, dbo.Adresi.PK, dbo.Adresi.Grad,
dbo.Adresi.Tel, dbo.Adresi.SP, dbo.Adresi.Deca, dbo.Adresi.RBT, dbo.supruzi.ImeS, dbo.Deca.EGND, dbo.Deca.ImeD, dbo.Adresi.EGNS,
dbo.socrab.SR, dbo.Adresi.EGNK AS EGNK2, dbo.Deca.EGNK AS EGNK3, dbo.supruzi.EGNS AS EGNS2, dbo.socrab.Ul, dbo.Adresi.Ul AS Ul1
FROM dbo.SR INNER JOIN
dbo.socrab ON dbo.SR.SR = dbo.socrab.SR INNER JOIN
dbo.Adresi INNER JOIN
dbo.Klienti ON dbo.Adresi.EGNK = dbo.Klienti.EGNK ON dbo.socrab.Ul = dbo.Adresi.Ul LEFT OUTER JOIN
dbo.Deca ON dbo.Klienti.EGNK = dbo.Deca.EGNK LEFT OUTER JOIN
dbo.supruzi ON dbo.Adresi.EGNS = dbo.supruzi.EGNS
WHERE (dbo.socrab.SR = 1)
ORDER BY dbo.Klienti.EGNK
Може би проблема е че във view-то не може да се записват данни а се записват директно в таблиците а в тях няма такива атрибути, но ако сменя имената на атрибутите в основните таблици няма да мога да направя връзките след това.
Надявам се някой да ми помогне като каже къде бъркам нещо или да даде друга идея как да го направя това въвеждане на данни, така че данните да се въвеждат във всички таблици.

Отговор
в отговор на frezia19 #15

Re: Delphi

Според хелпа на T-SQL за INSERT:
view_name
Is the name and optional alias of a view. The view referenced by view_name must be updatable. The modifications made by the INSERT statement cannot affect more than one of the base tables referenced in the FROM clause of the view. For example, an INSERT into a multitable view must use a column_list that references only columns from one base table. For more information on updatable views, see CREATE VIEW.

[линк]

"Другия" начин съм ти го посочил в предишния постинг, ама явно не ти се чете. Забележи че примера е от 4 страници. На третата страница от примера е показано как в таблица (DBGrid) се поставя комбо, с което можеш да избереш ключ (в случая това прословуто EGN) от друга таблица. Демек: правиш един DBGrid в който редактираш таблицата Адреси, като полето ЕГН го реализираш като комбо. Още по-забавния начин е показан на страница 3 в примера, където от списък с имената на клиенти избираш клиента и неговото ЕГН се поставя в грида, работещ с таблицата Адреси например. Ако сложиш един списък за клиенти и по един грид за Адреси, Съпрузи, Деца и т.н. при избор на клиент неговото ЕГН може да се поставя автоматично във всеки един грид, и то без да пишеш и един ред код.
Линка съм го сложил неслучайно, щото има и добро теоретично обяснение, не само пример. И е отлично илюстрация на твърдението че Делфи е визуална RAD среда.

Редактирано от Pechenia на

Отговор
в отговор на frezia19 #16

Re: Delphi

Проблема е в ИМЕНАТА НА ПАРАМЕТРИТЕ. За съжаление в ADO парамерите НЕ МОГАТ ДА СЕ ПРЕИЗПОЛЗВАТ!!! Сложи уникални имена на всички параметри - на пръви прочит Ul го има два пъти.

Отговор
в отговор на Pechenia #17

Re: Delphi

Благодаря ти за линковете на предишния пост. Като ги разгледах по внимателно наистина ми свършиха работа, защото явно е трябвало да се използва master detail връзка. Вече нямам проблеми със записа на данни въпреки че интерфейса сега не е мн добър но това не е толкова важно.Важното е,че със записването и търсенето нямам никакъв проблем.
Още веднъж много благодаря!

Отговор