سلام اقای میری عزیز من
سلام اقای میری عزیز من. بی ربط نیست در حال طراحی یک نرم افزار انبار داری بزرگ هستم
دوستان سوال را به صورت واضح تر مطرح میکنم. خروجی داده های من تمام در فرم ویژوال بیسیک است.
قسمتی از کد را برای درک بهتر سوال در فایل ضمیمه میاورم.
من یک جدول دارمt1 با فیلدهایی بنام ,idt1,f1,f2,f3,f4 و جدولی دیگر بنام t2 در همان دیتا بیس با فیلدهای idt2,r1,r2,r3,r4
تمام آنها اعداد است.
جدولی دیگری دارم بنام caladd با فیلد idcaladd,add1,add2,add3,add4 در همان دیتا بیس.حال من میخواهم جمع f1+r1 را در فیلد add1 جدول caladd ذخیره کنم. هر بار با اضافه شدن جدول t1 و t2 فقط جمع جدید در فیلد add1 باشد.هر سه جدول دارای ایدی میباشد.
نمایش خروجی هر سه جدول در کنترلر ویژوال بیسیک datagrinwview میباشد. فایل ضمیمه نمونه کد میباشدولی برای برنامه دیگر است .جهت راهنمایی .
دستور insert into هم تست شد.جواب منفی است.
6 پاسخ
vb دیگه زیاد کاربری نیست ، c# بخونید و اینکه برید به سمت برنامه های وب با روش core
سلام
اول از همه اینکه نمی خواستم ناراحتتون کنم ! اگه این طور شده ببخشید. راستش اینقدر سوالتون 1 و2 و3 داشت به نظر از این تمرین هایی اومد که استادها می دن و دانشجو رو سر کار می زارن.
دو تا نکته اول کار :
1- ببخشید پاسخ بسیار طولانی میشه
2- میتونیم ادامه این بحث - اگه لازم بود- رو تو همین سوال داشته باشیم و نیاز نیست سوال جدید اضافه کنید.
اما نظرات من :
اول : اینکه چرا insert کار نمی کنه ؟ خب دو تا سطر دارید به دو تا جدول اضافه می کنید ، خب مجموعشون رو هم باید بشه محاسبه کرد و به جدول سوم insert کرد دیگه ؟!
دوم : اگه هر دو جدول id دارند ، میشه تو sql روی جدوال trigger نوشت که چک کنه اگه یه خط اضافه شد و id متناظر اون هم تو جدول دیگه بود جمعشون کنه و تو جدول سوم بنویسه. اما یه سری دردسر داره :
الف) باید تو هر دو جدول trigger بنویسید و احتمالا این جمع دوبار انجام بشه و دیتابیس بی خودی درگیر بشه.
ب) باید برای update و delete شدن هر سطر هم trigger بنویسید.
سوم : اصولا من با داشتن یک جدول برای نگهداری جمع یا تفریق یا ... دو تا جدول دیگه مخالفم ! چون اولا فضای اضافی روی دیتابیس میگیره و دوما دردسرهای هربار محاسبه ومطمئن بودن درستی اون جدول رو دارید. در نظر بگیریرد از هر طریقی که یکی از این دو جدول update بشه باید سطر متناظر در جدول مجموع هم بروز بشه.
چهارم : من خیلی آدم بدبینی هستم ! آیا اطمینان دارید که این id ها در دو جدول اولیه همیشه متناظر هستند ؟ مثلا اگه چند تا کاربر همزمان دیتا بزنند، ممکن نیست چیزی به هم بریزه ؟
پنجم : بهترین راه از نظر من یا محاسبه در زمان اجرا یا استفاده از view که بتونه خودش جمع بزنه و نتیجه رو بهتون بده نه اینکه جمع رو یه جا ذخیره کنید.
خب ایراد که اصولا تو همون یک خط کد sql دارید :
select Bank.b1*2 , Bank.b2*2 into bank from city
درستش اینه
insert into city
select
b1*2 as c1,
b2*2 as c2,
from bank
البته کلا نمی فهمم می خواید چی کار کنید ، شما می خواید هر بار کل جدول رو بریزید ؟
+ یه پیشنهاد دوستانه : با این روش دنبال پیاده کردن برنامه بزرگ نباشید ! خیلی راه دارید. هم تو طراحی دیتابیس هم کد sql هم کد برنامه.
کلا اگه هم تازه دارید شروع می کنید vb رو استارت نزنید بهتره.
کار نکرد یعنی چی ؟ خب چه خطایی میده ؟ من شبیه این کد رو همین امروز 10 بار نوشتم !
"قسمت ورود دیتا از تکسباکسم به جدول " یعنی دقیقا کجا ؟
تصویر کدتون و خطایی که میگیریرد رو بدید، خطاها معمولا کاملا گویا هستند و معلوم میشه چی کمه.
سلام .من خیلی دوست دارم ایراد های منو بگید. نظرلطف شماست .
کد زیر را در ماژول ویژوال بیسیک که درست کار میکنه ببینید.
Imports System.Data
Imports System.Data.SqlClient
Module Module1
= Public StrCon1 As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename
" & My.Application.Info.DirectoryPath & "\sql\Test.mdf;Integrated Security=True;Connect Timeout=30"
Public Con1 As SqlConnection = New SqlConnection(StrCon1)
""=Public strsql1 As String
""= Public strsql2 As String
'"= Public strsql3 As String
Public Da1 As SqlDataAdapter
Public Da2 As SqlDataAdapter
Public Da3 As SqlDataAdapter
Public Ds1 As New DataSet
Public Ds2 As New DataSet
Public Ds3 As New DataSet
Public Com1 As SqlCommand
Public Com2 As SqlCommand
Public Com3 As SqlCommand
End Module
حال کد در لود شدن فرم به صورت زیر است.
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
()Ds1.Clear
()Ds2.clear
()Ds3.Clear
()Con1.Open
"strsql1 = "select * from Bank
"strsql2 = "select * from city
"strsql2 = "select * from ostan
Da1 = New SqlDataAdapter(strsql1, Con1)
Da2 = New SqlDataAdapter(strsql2, Con1)
Da3 = New SqlDataAdapter(strsql3, Con1)
Da1.Fill(Ds1, "Bank")
Da2.Fill(Ds2, "city")
Da3.Fill(Ds3, "ostan")
()Con1.Close
()DataGridView1.DataBindings.Clear
DataGridView1.DataSource = Ds1.Tables("bank")
()DataGridView2.DataBindings.Clear
DataGridView2.DataSource = Ds2.Tables("city")
()DataGridView3.DataBindings.Clear
DataGridView3.DataSource = Ds3.Tables("ostan")
End Sub
End Class
من سه تا جدول بنام بانک وسیتی و استان را در اسکیول سرور درست کردم و سپس بعد از تعریف کانکشن و دیتاست و سایر ملظومات در ویژوال بیسیک دات نت فراخوانی کردم
و درست هم در سه تا کنترل DataGridView به من جدولها را نشان میده
من دستورات زیر را به این صورت تعغییر دادم ولی انجام نمیشه
نام فیلهای جدول بانک:RowBank,b1,b2
نام فیلهای جدول سیتی:Rowcity,c1,c2
نام فیلهای جدول استان:Rowostan,o1,o2
کدی بنویس که فیلهای جدول بانک را دو برابر کند یا در جدول خودش به قول شما ذخیره کند یا در جدول سیتی من ذخیره کند
کمک شما در این دستوراته
strsql1 = "select * from Bank
"strsql2 = "select Bank.b1*2 , Bank.b2*2 into bank from city
"strsql2 = "select * from ostan
ممنون از توجهتان و لطف شما .
سلام جدولها فرضی است . بعدا اسامی را مناسب تعغییر میدم
1- جدول بانک موجودی از قبل انبار 2-جدول سیتی کالای ورود به انبار3-جدول استان کالای خروج انبار
بدست آوردن موجودی در حال حاضر روش زیر است:
مجموع جمع فیلدهای جدول بانک با جمع فیلدهای جدول سیتی منهای جمع فیلدهای جدول استان برابر است با موجودی کالا در انبار .
تا اینجا درست. حال راهنمایی بفرمایید الگوریتم به چه صورت میباشد. این کد هم لطف کردید فرستادید کار نکرد.
strsql3 = "insert into city select b1*2 as c1,b2*2 as c2,from bank"
این کدinsert into را من در قسمت ورود دیتا از تکسباکسم به جدول استفاده کردم
strsqlSave = "INSERT INTO Table_1(con1,con2,con3,con4,unit) VALUES (@con1,@con2,@con3,@con4,@unit)"
ولی من میخواهم از جدول دیگر بخوانم .فرض کنیدکدی دیتا را از یک جدول بگیرد و به فیلدجدول مورد نظرم درج کند .
من ویژوال را در حد متوسط بلدم.ولی sqlserver را 6ماه شروع کردم
کلا اگه هم تازه دارید شروع می کنید vb رو استارت نزنید بهتره.راهنمایی بکنید از کجا شروع کنم