Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197

Как реализовать автоматическую генерацию номеров документов

29.03.2012, 12:18. Показов 2778. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть таблица Number с полем Num, в которое будут записываться автоматически генерируемые номера документов. Как это реализовать?
Я решил сделать так: сделать кнопку "Создать новый документ", при нажатии на которую будет сделан запрос к БД, а именно к таблице Number, там надо узнать значение последнего номера документа и увеличить его на 1. Если мой подход верен, то как это сделать? Есть функция, которая возвращает значения полей таблицы Number. А вот как узнать значение поля Num в последней строке? Если бы была команда MoveLast...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2012, 12:18
Ответы с готовыми решениями:

Как реализовать генерацию чисел от 000000 до 999999
Здравствуйте, подскажите пожалуйста, как реализовать генерацию от 000000 до 999999, VB заменяет мне 6 нулей на один и отсчет идет от 0, то...

Как создать автоматическую генерацию формы?
Здравствуйте, форумчане. Можно ли на PHP создать автоматическую генерацию формы? Например, на странице уже есть форма с 3 полями, которые...

Как реализовать генерацию события в основном потоке?
Всем здравствуйте! У меня есть некий класс, в котором в отдельном потоке выполняется циклическая операция, после каждой с итераций...

14
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
29.03.2012, 12:43
делай выборку для этого столбца. Из полученного массива бери последний номер (член массива).
0
 Аватар для SergKr
67 / 41 / 3
Регистрация: 07.12.2010
Сообщений: 328
29.03.2012, 12:45
Ставь поле в counter и всё. БД сама будет новый номер подставлять...
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
29.03.2012, 13:33  [ТС]
Цитата Сообщение от SergKr Посмотреть сообщение
Ставь поле в counter
Этот вариант не подойдёт. Допустим, решил удалить последний номер документа под номером 2. Счётчик создаст новый номер 3 посчитав, что удалённый номер существует. Нумерация в этом случае будет 1, 3 и т.д. А надо, чтобы нумерация была последовательной.

Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
делай выборку для этого столбца. Из полученного массива бери последний номер (член массива).
Выборку из таблицы я сделал, хотя могу подредактировать запрос, чтобы делал выборку только столбца. Но как взять последний номер? Я так понял, что надо массив загнать в цикл и присваивать переменной значение столбца Num. Когда цикл закончится (а закончится он на последней строке), то в переменной останется последнее значение столбца Num. В принципе, это вариант, но ведь это непроизводительно, если номеров очень много. Получается, что теперь нет аналога команды MoveLast?
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
29.03.2012, 13:54
Цитата Сообщение от paa66 Посмотреть сообщение
Выборку из таблицы я сделал, хотя могу подредактировать запрос, чтобы делал выборку только столбца
не надо. Как я помню, ты загоняешь выборку в DataTable
Ну так лезь в нее, в нужный столбец и бери последнюю запись

Добавлено через 14 минут
SQL
1
SELECT MAX(столбец ) FROM...
Выполнять лучше методом ExecuteScalar
И получать снепосредственно в переменную
VB.NET
1
Dim ind as integer = SqlCom.ExecuteScalar
sqlcom - команда с заданными параметрами подключения и запросом
1
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
29.03.2012, 16:30  [ТС]
С трудом разобрался, только
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
SELECT MAX(столбец ) FROM...
лучше заменить на
SQL
1
SELECT LAST(столбец ) FROM...
Теперь осталось всё утрясти в короткий, грамотный код. Спасибо!

Добавлено через 1 минуту
Да, кстати, решение нашлось всё-таки через SQL, а через VB решения нет?
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
29.03.2012, 17:24
LAST... ну да, я по привычке под SQL server все подгоняю.
Ну а чисто на VB - обрабатывать выборку из столбца. Ну как выше писал
Кстати, циклом бегать не надо.
У тебя результатами выборки заполнена DT (DataTable)
Вот и сразу переходи на строку по индексу Rows.Count-1 и бери значение нужного столбца
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
29.03.2012, 19:23  [ТС]
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
Вот и сразу переходи на строку по индексу Rows.Count-1 и бери значение нужного столбца
Не пойму, как можно перейти к последней строке? Была бы команда MoveLast или GoToRecord acLast. Да, есть дататэйбл с набором записей. Допустим, сделаю так:
VB.NET
1
Dim lastNumber = dt.Rows.Count - 1
но это будет подсчёт количества строк в дататэйбл за минусом одной. А дальше как встать на последнюю запись?
0
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
29.03.2012, 20:09
Цитата Сообщение от paa66 Посмотреть сообщение
как встать на последнюю запись?
"Встать" на определённую запись в пределах формы позволяет BindningSource
VB.NET
1
2
3
Public Class frmMain
    Dim WithEvents bsStorages As New BindingSource 'связанный источник для хранилищ
    Dim WithEvents bsContents As New BindingSource 'связанный источник для содержимого
VB.NET
1
2
3
4
5
        bsStorages.DataSource = db.Storages 'связанный источник связываем c таблицей
        lstStorages.DisplayMember = "Title" 'в листбоксе отображаем заголовки
        lstStorages.ValueMember = "ID" 'в поле дата листокса будет идентификатор
        lstStorages.DataSource = bsStorages 'связываем листбокс с источником
        tsslContentsCount.Text = bsContents.Count ' выводим количество записей
вот у него как раз и есть метод MoveLast
VB.NET
1
        bsStorages.MoveLast()
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
29.03.2012, 23:24
VB.NET
1
Dim lastNum as integer = dt.Rows(dt.Rows.Count - 1).Item(индекс или имя столбца в таблице)
обязательно надо встроенный метод?
Да, забыл: dt - это твой экземпляр DataTable, заполненный выборкой

Добавлено через 1 минуту
Цитата Сообщение от paa66 Посмотреть сообщение
но это будет подсчёт количества строк в дататэйбл за минусом одной
это будет индекс последней строки в таблице
1
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
30.03.2012, 07:51  [ТС]
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
обязательно надо встроенный метод?
Если "встроенный метод" - это перемещение по записям с помощью VB, то не обязательно. Я только начинаю изучать программирование, занимаюсь этим в свободное время, хобби можно сказать. И такие задачки меня развивают в программировании. Сделал по последнему варианту
VB.NET
1
Dim lastNum As Integer = dt.Rows(dt.Rows.Count - 1).Item(1)
Всё работает. Ещё раз спасибо.
Цитата Сообщение от cergew Посмотреть сообщение
"Встать" на определённую запись в пределах формы позволяет BindningSource
Пробовал в первые разы своего знакомстся с VB бросать на форму таблицу из БД, автоматически генерировался код, появлялся BindningSource. По совету форумчанина делаю сейчас всё "в ручную": ничего на форму не бросаю, а создаю соединение, адаптер, команду, делаю запрос и т.д. В этой задаче ничего на экран выводить не надо, а я так понял, что в вашем примере инфа выводится на экран (используется листбокс). Я всё же попытался применить ваш метод, немного изменил код
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Class frmMain
 
    Dim WithEvents bsStorages As New BindingSource 'связанный источник для хранилищ
    Dim WithEvents bsContents As New BindingSource 'связанный источник для содержимого
    Dim lstStorages As ListBox
 
    Sub bindSourse()
 
        bsStorages.DataSource = dt.Storages 'связанный источник связываем c таблицей
 
        lstStorages.DisplayMember = "Title" 'в листбоксе отображаем заголовки
 
        lstStorages.ValueMember = "ID" 'в поле дата листбокса будет идентификатор
 
        lstStorages.DataSource = bsStorages 'связываем листбокс с источником
 
        tsslContentsCount.Text = bsContents.Count ' выводим количество записей
 
    End Sub
 
End Class
и высветились ошибки здесь
VB.NET
1
bsStorages.DataSource = dt.Storages
'Storages' is not a member of 'System.Data.DataTable'. dt - это DataTable, который возвращает моя функция после запроса к БД. Т.е., надо подставлять не DataTable, а что-то другое. А что, - не знаю
0
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
30.03.2012, 08:08
Цитата Сообщение от paa66 Посмотреть сообщение
'Storages' is not a member of 'System.Data.DataTable'. dt - это DataTable, который возвращает моя функция после запроса к БД. Т.е., надо подставлять не DataTable, а что-то другое. А что, - не знаю
Storages(Хранилища) это имя таблицы в моей БД такое, т.е. в своём случае используй просто dt без .Storages
Цитата Сообщение от paa66 Посмотреть сообщение

Я тоже очень не люблю всякие "левые" компоненты на форме в дизайнере, раздражают. Поэтому объявляю в коде.
VB.NET
1
2
Dim WithEvents bsStorages As New BindingSource 'связанный источник для хранилищ
 Dim WithEvents bsContents As New BindingSource 'связанный источник для содержимого
То есть на форму ничего кидать не надо.
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
30.03.2012, 12:54  [ТС]
Цитата Сообщение от cergew Посмотреть сообщение
в своём случае используй просто dt
Сделал и получилось так:
VB.NET
1
2
3
Dim dt = GetDt(SqlQuery) ' делаю запрос к БД
        Dim frm As New frmMain
        Dim lastNum As Integer = frm.bindSourse
Почитал литературу про модули класса и в модуле класса сделал так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Class frmMain
 
    Dim WithEvents bsStorages As New BindingSource 'связанный источник для хранилищ
    Dim WithEvents bsContents As New BindingSource 'связанный источник для содержимого
    Dim lstStorages As ListBox
    Dim tsslContentsCount As Object
 
    Public Function bindSourse() As Integer
 
        bsStorages.DataSource = dt 'связанный источник связываем c таблицей
 
        lstStorages.DisplayMember = "Title" 'в листбоксе отображаем заголовки
 
        lstStorages.ValueMember = "ID" 'в поле дата листбокса будет идентификатор
 
        lstStorages.DataSource = bsStorages 'связываем листбокс с источником
 
        tsslContentsCount.Text = bsContents.Count ' выводим количество записей
 
    End Function
 
End Class
Пришлось объявить tsslContentsCount как объект, хотя мне кажется, что это должно быть Integer. В результате дэбуг останавливается на строке:
VB.NET
1
lstStorages.DisplayMember = "Title"
с ошибкой Object reference not set to an instance of an object.
0
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
30.03.2012, 15:02
Да блин, это для примера всё. Код из работающего приложения просто кинул сюда.
Это так контролы на форме называются:
lstStorages - это ListBox с "Хранилищами"
tsslContentsCount.Text - это такой label на StatusStrip-е, в нём я отображаю количество отобранных записей

Добавлено через 7 минут
Вся фишка в том, что ты для формы для каждой таблицы объявляешь Bindingsource, потом свой DataTable связываешь с этим BindingSource, а вот уже BindingSource связываешь непосредственно с нужным тебе контролом(ListBox, DataGridView и т.п.)

В результате появляется простая возможность в коде менять текущую запись (bs.movelast, bs.movefirst, bs.movenext, и т.д.). При этом в самих контролах это всё будет тоже отражено. Ещё можно отлавливать событие BindingSource.CurrentChanged вместо (например) DataGridView.SelectionChanged (так как выделение в датагриде может измениться и без смены текущей записи, то будут лишние телодвижения в коде)
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
30.03.2012, 16:42  [ТС]
Я уже совсем запутался. Изначально я сказал, что
Цитата Сообщение от paa66 Посмотреть сообщение
В этой задаче ничего на экран выводить не надо, а я так понял, что в вашем примере инфа выводится на экран (используется листбокс)
Потом ты отвечаешь, что
Цитата Сообщение от cergew Посмотреть сообщение
То есть на форму ничего кидать не надо.
Я эту фразу понял, что листбокс и т.д. создаётся программно и на самом деле не выводится на экран. Тогда я пытаюсь осуществить твой вариант. Теперь ты говоришь, что
Цитата Сообщение от cergew Посмотреть сообщение
Это так контролы на форме называются
Сейчас я понимаю, что для реализации моей задачи твоим способом надо создать форму, разместить на ней элементы управления (контролы) и написать код. Если это так, то в моём случае это явно нерационально, т.к. мою задачу можно реализовать без вывода на экран, всё сделать в оперативной памяти.
Ты не серчай за мою непонятливость, я совсем не разбираюсь в программировании, только начинаю изучать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2012, 16:42
Помогаю со студенческими работами здесь

Как правильно реализовать непроходимость и генерацию стен в игре
Я тут накодил вывод массива, рандомную генерацию стен и управление игроком(@) для игрушки. uses crt; const m = 24; n = 48; ...

Как можно программно реализовать генерацию случайных графов
1) Какие бывают еще случайные графы, кроме графа Эрдеша-Реньи? 2) Как можно программно реализовать генерацию случайных графов?

Как реализовать генерацию рандомных чисел в заданном диапазоне?
Я Хочу Сделать Генерацию Рандомный Чисел В Заданном Диапазоне ну например от 100 до 120.Ошибок Компилятор не выдаёт.Но Программа Работает...

Как реализовать автоматическую нумерацию строк в БД
Добрый вечер, хорошие люди! Такой вопрос по SQL. Имеется БД, в ней есть таблица с публикациями. Столбцы ID, NEWS, DATE - например....

Как реализовать автоматическую подстановку символов?
Здравствуйте! Подскажите как сделать что бы при вводе в строку координаты (Пример: 100° 59' 59.2'') автоматически подставлялись символы °...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru