Ошибка при генерации кода для свойства cursor

RRS feed

  • Remove From My Forums
  • Question

  • Hi,

    I’m getting the following error in VS2005 pro on xp sp2;
    ‘Code generation for property ‘Cursor’ failed. Error was ‘CursorConverter’ is unable to convert ‘System.Windows.Forms.Cursor’ to ‘System.ComponentModel.Design.Serialization.InstanceDescriptor’.’

    Anyone know what this is about?

All replies

  • If no-one has ever heard of this, is there a mechanism for reporting it as a definite bug in Visual Studio? It’s really quite annoying, in the way that Lotus Notes for example is annoying.

  • when does this happen? What are the repro steps?

  • Visual studio 2005 — version 8.0.50727.42.net framework version 2.0.50727writing in c#windows applicationsometimes random Start Debugging  or start without debugging regularly in one of my applications in deveopment but not in anotherthe message box pops up 7 times before the application I am working on comes up… it does not happen in the application i have created with visual studio

  • Are you using custom controls?  I have seen cases of this error when multiple versions of a control have been referenced by the same component.  For example, let’s suppose you have a control like «RoundButton» that’s stored in WhizBangControls.Dll.  If you have two versions of WhizBangControls.dll referenced by the form, than this error can appear.

    Anson

  • Anson -thanks for the reply. This appears to be in the editor of the visual studio version I referenced above, and not in my own application. It can happen after a hard reboot when the editor is the first application I run; sometimes, however, with a hard reboot it does not occur. It is problematic in writing and compiling code, not in running the applicaiton I am working on.(windows XP sp2)Thank  youNan

  • Hi folks,

    I get the same error … sometimes, actually fairly often but not always.  Anybody know any more about this?

    Definitely has something to do with custom controls, but that’s all I can figure out so far.

    Thanks,
    —George

  • This usually means that the get or set of one of the properties in a Custom Control has not been coded properly. The error message should tell you which property of which Custom Control. Check the get and set statements for that property carefully. When VS tries to generate the code for the property in the form that uses the Custom Control, the Custom Control would not have been initialized yet, so in the get or set of the property assumptions about objects or controls in the Custom Control might have been made which may not be correct (iaw check for null values of objects before accessing members in the get and set of properties of Custom Controls).

  • I’m having the exact problem and ‘Cursor’ is not defined in my code at all, though the inherited UserControl has such property. Anyone got any luck on this?

  • Hi Anson Horton MSFT
    You are right, when we have multiple versions of same then we can have such error….

    I am also facing the same problem

    but . . ..

    After facing such problem (in vb.net) I have created Project from scrach. . . . say, myUserControl
    Then i have started new instance of VS 2k5 and created new project …say, TestMyUserControl, and i am refrencing MyUserControl in this project… but still I am facing same error . . ..
    Code generation for property ‘xxx’ failed ……
    Thanks in Advance…

  • Sorry, no solution here, but maybe some additional info:

    I am getting the same error with a vb application using custom controls linked from an external .dll.  My message in the designer is: «Code generation for property ‘Telecoms’ failed. Error was: ‘ Property accessor ‘Telecoms’ on object ‘…’ Threw the following exception:’ExecuteReader requires an open and available Connection. The connection state is closed.»

    Why does the designer/code generator need to have access to the database? The error pops up about 5 times after save or F5 are pressed, intermittent while the project is open. 

    My connection string is built after the app is created, from information that the user enters. There is no way the connection can be opened during design time and, in my opinion, there should be no need to.

    The application can be debugged without problems and runs fine published. No error messages popping up. This error is just in the VS designer when the project is open

    Apologies if this deviates from your original post.

  • I can add a little more insight here.

    In addition to the fact that property Getters cannot depend on non-available items, Constructors and the code they call cannot depend on these things either. I was getting the above «code generation for property Cursor failed CursorConverter» type of errors in a common init code i had called from a ctor.

    At least some of the items you apparently cannot depend on when in design mode are:

    • other objects such as a singleton using the Singleton pattern (e.g. Class.Get() ),

    • other member variables that might not have been iniitialized,

    • any property or code (remember this can be in ctor-called code) that uses a stream to, let’s say, deserialize a Cursor (see some of the above posts). Streams apparently can’t access in deisgner mode

    • Any calls to code that could use another thread. For example, a DB method that would try some I/O.

    • Try-Catch doesn’t help protect this code. E.g. Try {designer failing code} Catch {ignore} will not help.

    Also note that if you have nested user controls, let say a ParentCtrl that contains ChildCtrl, code in ChildCtrl cannot use the «this.DesignMode» barrier in order to not call the verbotten code during it’s parent’s design phase.

    I don’t know how to tell if a control or any of it’s containment ancestors are in design mode, but it would be nice to know!

    And that’s what i learned in about a 1/2 day of working around this problem.  (That is, code that runs fine when executing the app, but dies in the designer.)

    fwiw,

    p.

  • following attribute helps:

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

  • This bug still exists as of today.  I’m running into it sporadically and it’s _very_ annoying, especially as it prevents some operations from completing when it fires.

    Any further info on this bug and its workarounds?

    Thanks,
    Kevin

  • I have been getting the same error.  I have an error in my business object with datetime parsing and I know that.  My bigger issue is that I have extended the Combobox control to populate from a database based on a Generic business object.  The desginer actually pulls the data from the database in design mode and code generates the list to populate the combobox during design.  

    How do I make the desginer (Visual Studio 2005 8.0.50727.42) stop hardcoding the business objects during design in the UserControl.Desiginer.cs» Each time I find it I go in and delete the code that was generated but if you view the control in design it repopulates.

    Adam

  • I have been having this same problem.  Where did you place this attribute (i.e. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)])?

  • Such an attribute would be placed upon the property that you don’t want to be serialized.  But that means the designer will never generate code for it.  This is a really old post though so you should open a new one as your problem might not be related.  This thread actually ended up diverging such that the original post was not the same problem as the ending thread.  I also recommend that you search on how to create user controls because the way they are serialized is not what most people expect and, hence, cause problems.  Please post your question to the WinForms forum.

    Michael Taylor — 2/2/2010
    http://msmvps.com/blogs/p3net

Студворк — интернет-сервис помощи студентам

Доброго времени суток!
Помогите, кто может!!!
Выходит ошибка которую не пойму как исправить (см. вложение)!
Выдаётся сообщение даже не при запуске или компиляции проекта, а
вообще, при попытке сохранить форму или код формы.
Дальше только перезапуск Студии. Но опять при попытке сохранить изменения в форме
приводят к этой ошибке.
Ситуация следующая:
1. Есть класс CPointXX;
2. Есть класс CFigureXX, который содержит private List<CPointXX> m_Points;
3. Есть контрол, в котором private CFigure m_Figure = new CFigure();
Всё компилиться без ошибой и предупреждений. Вроде вопросов нет. НО!!!
Когда я этот контрол ставлю на форму, начинается «ворфоломеевская ночь».
Выходит такое сообщение и компиляция не проходит.

Кто-нибудь!!! Помогите, пожалста!!!

При добавлении/изменении большого количества записей (10? и выше), производительность Entity Framework оставляет желать лучшего. Причиной этому являются как архитектурные особенности самого фреймворка, так и неоптимальный генерируемый SQL. Забегая вперед — сохранение данных в обход контекста сокращает время выполнения на порядки.

Содержание статьи:
1. Insert/Update стандартными средствами Entity Framework
2. Поиск решения проблемы
3. Интеграция Entity Framework и SqlBulkCopy
4. Продвинутая вставка с использованием MERGE
5. Сравнение производительности
6. Выводы

1. Insert/Update стандартными средствами Entity Framework

Начнем с Insert. Стандартным способом добавления новых записей в БД является добавление в контекст с последующим сохранением:

Каждый вызов метода Add приводит к дорогостоящему в плане выполнения вызову внутреннего алгоритма DetectChanges. Данный алгоритм сканирует все сущности в контексте и сравнивает текущее значение каждого свойства с исходным значением, хранимым в контексте, обновляет связи между сущностями и т. п. Известным способом поднятия производительности, актуальным до выхода EF 6, является отключение DetectChanges на время добавления сущностей в контекст:

Также рекомендуется не держать в контексте десятки тысяч объектов и сохранять данные блоками, сохраняя контекст и создавая новый каждые N объектов, например, как тут. Наконец, в EF 6 появился оптимизированный метод AddRange, поднимающий производительность до уровня связки Add+AutoDetectChangesEnabled:

К сожалению, перечисленные подходы не решают основной проблемы, а именно: при сохранении данных в БД, На каждую новую запись генерируется отдельный INSERT запрос!

С Update ситуация аналогичная. Следующий код:

Приведет к выполнению отдельного SQL-запроса на каждый измененный объект:

В простейших случаях, может помочь EntityFramework. Extended:

Данный код выполнится в обход контекста и сгенерирует 1 SQL-запрос. Более подробно о скорости EF и работе с этой библиотекой в статье за авторством tp7. Очевидно, что решение не универсальное и годится только для записи во все целевые строки одного и того же значения.

2. Поиск решения проблемы

Испытывая стойкое отвращение к написанию «велосипедов», я в первую очередь поискал best-practices для множественной вставки с помощью EF. Казалось бы, типовая задача — но подходящего решения «из коробки» найти не удалось. В то же время, SQL Server предлагает ряд техник быстрой вставки данных, таких как утилита bcp и класс SqlBulkCopy. О последнем и пойдет речь ниже.

EntityFramework. BulkInsert
На поверку оказавшийся нерабочим. При изучении Issues я наткнулся на дискуссию с участием… небезызвестной Julie Lerman, описывающую проблему, аналогичную моей и оставшуюся без ответа авторов проекта.

EntityFramework. Utilities
Живой проект, активное сообщество. Нет поддержки Database First, но обещают добавить.

3. Интеграция Entity Framework и SqlBulkCopy

Попробуем сделать всё сами. В простейшем случае, вставка данных из коллекции объектов с помощью SqlBulkCopy выглядит следующим образом:

Сама по себе задача реализовать IDataReader на основе коллекции объектов тривиальна, поэтому я ограничусь ссылкой и перейду к описанию способов обработки ошибок при вставке с использованием SqlBulkCopy. По умолчанию, вставка данных производится в своей собственной транзакции. При возникновении исключения выбрасывается SqlException и происходит rollback, т. е. данные в БД не будут записаны вообще. А «родные» сообщения об ошибках данного класса иначе как неинформативными не назовешь. Например, что может содержать SqlException. AdditionalInformation:

К сожалению, SqlBulkCopy зачастую не предоставляет информацию, позволяющую однозначно определить строку/сущность, вызвавшие ошибку. Еще одна неприятная особенность — при попытке вставить дубликат записи по первичному ключу, SqlBulkCopy выбросит исключение и завершит работу, не предоставляя возможности обработать ситуацию и продолжить выполнение.

Маппинг
В случае корректно сгенерированных сущностей и БД становятся неактуальными проверки на соответствие типов, или длину поля в таблице, как тут. Полезней разобраться с маппингом колонок, выполняемым через свойство SqlBulkCopy. ColumnMappings:

Что дает возможность вручную провести маппинг между классом-источником и целевой таблицей.

Использование свойства SqlBulkCopy. BatchSize и класса SqlBulkCopyOptions

SqlBulkCopy. BatchSize:

BatchSize Количество строк в каждом пакете. В конце каждого пакета серверу отправляется количество содержащихся в нем строк.

SqlBulkCopyOptions — перечисление:

Имя члена Описание
CheckConstraints Проверять ограничения при вставке данных. По умолчанию ограничения не проверяются.
Default Использовать значения по умолчанию для всех параметров.
FireTriggers Когда задана эта установка, сервер вызывает триггеры вставки для строк, вставляемых в базу данных.
KeepIdentity Сохранять идентификационные значения источника. Когда эта установка не задана, идентификационные значения присваиваются таблицей назначения.
KeepNulls Сохранять значения NULL в таблице назначения независимо от параметров значений по умолчанию. Когда эта установка не задана, значения null, где возможно, заменяются значениями по умолчанию.
TableLock Получать блокировку массового обновления на все время выполнения операции массового копирования данных. Когда эта установка не задана, используется блокировка строк.
UseInternalTransaction Когда эта установка задана, каждая операция массового копирования данных выполняется в транзакции. Если задать эту установку и предоставить конструктору объект SqlTransaction, будет выброшено исключение ArgumentException.

Мы можем опционально включить проверку триггеров и ограничений на стороне БД (по умолчанию выключена). При указании BatchSize и UseInternalTransaction, данные будут отправляться на сервер блоками в отдельных транзакциях. Таким образом, все успешные блоки до первого ошибочного, будут сохранены в БД.

4. Продвинутая вставка с использованием MERGE

Временная таблица
Необходимо создать таблицу в БД, полностью повторяющую схему таблицы для вставки данных. Создавать копии вручную — худший вариант из возможных, так как вся дальнейшая работа по сравнению и синхронизации схем таблиц также ляжет на ваши плечи. Надежнее копировать схему программно и непосредственно перед вставкой. Например, с использованием SQL Server Management Objects (SMO):

Стоит обратить внимание на класс ScriptingOptions, содержащий несколько десятков параметров для тонкой настройки генерируемого SQL. Полученный StringCollection развернем в String. К сожалению, лучшего решения, чем заменить в скрипте имя исходной таблицы на имя временной а-ля String. Replace(«Order», «Order_TEMP»), я не нашел. Буду благодарен за подсказку красивого решения по созданию копии таблицы в пределах одной БД. Выполним готовый скрипт любым удобным способом. Копия таблицы создана!

Другой вариант — использовать Database. ExecuteWithResults.

Копирование данных из временной таблицы в целевую
Осталось выполнить на стороне SQL Server инструкцию MERGE, сравнивающую содержимое временной и целевой таблиц и выполняющую апдейт или вставку (если необходимо). К примеру, для таблицы [Order] код может выглядеть следующим образом:

Данный SQL-запрос сравнивает записи из временной таблицы [Order_TEMP] с записями из целевой таблицы [Order], и выполняет Update, если найдена запись с аналогичным значением в поле Id, либо Insert, если такой записи не найдено. Выполним код любым удобным способом, и готово! Не забываем очистить/удалить временную таблицу по вкусу.

5. Сравнение производительности

Среда выполнения: Visual Studio 2013, Entity Framework 6.1.1 (Database First), SQL Server 2012. Для тестирования использовалась таблица [Order] (схема таблицы приведена выше). Были проведены измерения времени выполнения для рассматриваемых в статье подходов к сохранению данных в БД, результаты представлены в ниже (время указано в секундах):

Insert

Способ фиксации изменений в базе данных Количество записей
1000 10000 100000
Add + SaveChanges 7,3 101 6344
Add + (AutoDetectChangesEnabled=false) + SaveChanges 6,5 64 801
Add + отдельный контекст + SaveChanges 8,4 77 953
AddRange + SaveChanges 7,2 64 711
SqlBulkCopy 0,01 0,07 0,42

Ого! Если использовать метод Add для добавления в контекст и SaveChanges для сохранения, сохранение 100000 записей в БД займет почти 2 часа! В то время, как SqlBulkCopy на эту же задачу тратит менее секунды!

Update

Способ фиксации изменений в базе данных Количество записей
1000 10000 100000
SaveChanges 6,2 60 590
SqlBulkCopy + MERGE 0,04 0,2 1,5

Вновь SqlBulkCopy вне конкуренции. Исходный код тестового приложения доступен на GitHub.

Выводы

В случае работы с контекстом, содержащим большое количество объектов (10? и выше), отказ от инфраструктуры Entity Framework (добавление в контекст + сохранение контекста) и переход на SqlBulkCopy для записи в БД может обеспечить прирост производительности в десятки, а то и сотни раз. Однако, по моему мнению, использовать связку EF+SqlBulkCopy повсеместно — явный признак того, что с архитектурой вашего приложения что-то не так. Рассмотренный в статье подход следует рассматривать как простое средство для ускорения производительности в узких местах уже написанной системы, если менять архитектуру/технологию по каким-либо причинам затруднительно. Любой разработчик, использующий Entity Framework, должен знать сильные и слабые стороны этого инструмента. Успехов!

Как исправить ошибку при генерации RSA ключа для ЕГАИС?

При генерации RSA ключа (транспортного ключа) в личном кабинете ЕГАИС алкоголь могут возникать ошибки. Разобраться в этих ошибках непросто специалисту, не говоря уже о рядовом пользователе.

Попробуем разобрать типовые ошибки, которые возникают при генерации транспортных RSA ключей ЕГАИС.

Почему возникает ошибка при генерации ключа ЕГАИС?

В основном ошибки при генерации связаны с некорректными настройками компьютера.

Общие рекомендации для успешной генерации транспортного RSA ключа ЕГАИС

Для успешной генерации транспортных ключей на сайте ЕГАИС необходимо соблюсти некоторые требования и рекомендации:

Ошибка при генерации RSA ключа «Выберете устройство чтения смарт карт. «

Если при генерации ключа ЕГАИС вместо окна запроса пин-кода Вы увидели окно «Выберете устройство чтения смарт карт» или «Обнаружена смарт-карта, но она не может использоваться для текущей операции. » или «Смарт-карта не может выполнить запрошенную операцию либо операция требует другой смарт-карты», значит нужно скорректировать настройки компьютера.

Такая ошибка возникает из-за того, что настройки вашего компьютера не позволяют сформировать ключи, необходимые для работы УТМ ЕГАИС.

Если Вы используете носитель Рутокен ЭЦП, то вам необходимо сделать следующее:


Пробуйте сгенерировать транспортный ключ ЕГАИС еще раз.

В крайне редких случаях, если генерация ключа не проходит, помогает утилита восстановления работоспособности Рутокен (позволяет правильно определить драйвера носителя в системе).

Все должно получиться!

Ошибка в методе createCertificateRequest Error: CKR_PNI_INCORRECT

В этой ошибке прямым текстом, правда по иностранному, написано, что неверно введен пин-код.

Проверьте правильность ввода пин-кодов. Если на вашем носителе установлен пин-код по умолчанию. и Вы его не помните, то напоминаем:

Если не подходят стандартные пин-коды и пин-код, который установили Вы, то скорее всего носитель заблокировался. Для разблокировки носителя обратитесь к тому, у кого получали ключи, должны помочь.

Ошибка в методе createCertificateRequest Error: CKR_ATTRIBUTE_TYPE_INVALID

Такая ошибка была нами зафиксирована при использовании ключа JaCarta SE.

Для исправления ошибки необходимо инициализировать раздел PKI на носителе. Для этого откройте Единый клиент JaCarta желательно включить интерфейс Администратора (снизу слева кнопка «Переключиться в режим администрирования»). Перейдите вверху во вкладку PKI и нажмите «Инициализировать». При запросе пин-кода введите пин-код Администратора 00000000, пин-код Пользователя 11111111.

После успешной инициализации попробуйте снова сгенерировать транспортный ключ.

Также не забывайте о том, что для нормальной работы вашего защищенного носителя для ЕГАИС должен быть установлен свежий драйвер ключа!

Решения самых популярных проблем с ЕГАИС Вы можете найти в нашем Telegram канале «ЕГАИС простыми словами» (@egais_is_easy ).

Ошибка генерации сертификата в Личном кабинете налогоплательщика

При попытке получения новой электронной подписи (ЭП) пользователь Личного кабинета налогоплательщика на сайте ФНС может столкнуться с сообщением « Ошибка генерации сертификата. Попробовать еще раз ». После повторной попытки проходит какое-то время, после чего ошибка возникает вновь. Обычно это связано с проблемами в работе серверов сайта nalog. ru, которые испытывают перегрузки в связи с массовым наплывом пользователем. Давайте разберёмся, почему происходит ошибка, и как её исправить.

Особенности функционала сертификата подписи уполномоченного лица

Как известно, бумажную волокиту в финансовой отчётности всё чаще заменяет электронный документооборот. Он позволяет убыстрить процесс передачи отчётности предприятия в ФНС, упростить её проверку и выдачу соответствующего вердикта контролирующих органов.

Одним из инструментов электронного документооборота является « Личный кабинет налогоплательщика » на сайте ФНС. Благодаря его возможностям вы можете контролировать расчёты по имущественным налогам, отслеживать ход проверки поданных вами деклараций, просматривать данные об доходам поданных налоговыми агентами в виде 2-НДФЛ. Однако иногда пользователи могут сталкиваться с ошибкой генерации сертификата.

С 01 апреля 2015 года в Налоговый Кодекс РФ был внесён ряд изменений, связанных со сменой статуса «Личного кабинета налогоплательщика». Пользователи ЛК получили возможность отправлять в ФНС налоговые декларации, подписанные квалифицированной электронной подписью. Подписанные ЭЦП электронные документы признаются равноценными их бумажным аналогам.

Причины возникновения ошибки генерации сертификата в личном кабинете ФНС

При выполнении процедуры получения новой ЭЦП пользователи могут столкнуться с сообщением «Ошибка генерации сертификата». Повторные попытки соединения с сервером обычно никак не решают проблему. Система зависает на какое-то время, после чего ошибка генерации сертификата появляется вновь.

Её причинами является следующее:

Давайте разберёмся, как исправить ошибку генерации электронного сертификата в вашем Личном кабинете налогоплательщика

Как исправить проблему в ЛК налогоплательщика

Для того, чтобы избавиться от проблемы с генерацией сертификата, необходимо сделать следующее:

Источники:

Https://habr. com/ru/post/251397/

Https://avitek. ru/info/articles/kak-ispravit-oshibku-pri-generatsii-rsa-klyucha-dlya-egais/

Https://it-doc. info/oshibka-generacii-sertifikata-v-lichnom-kabinete-nalogoplatelshhika/

CodeNet - все для программиста!
Все для программиста!

  • Статьи
  • Форум
  • Исходники
  • Каталог
  • Хостинг
  • Утилиты

Справочник функций

  • Создать новую тему
  • Вопросы
  • Теги
  • Разделы
  • Без ответов
  • Мой кабинет

    • Личные сообщения
    • Уведомления
    • Профиль
    • Управление подписками
  • Новые сообщения

Ваш аккаунт

Войти через: 

Логин:

Пароль:

Запомнить меня

Забыли пароль?
Регистрация

Информацию о новых материалах можно получать и без регистрации:

RSS

Twitter

ВКонтакте

Последние темы форума

  • Музыка — 2019-04-26 23:59:43 (1)

    Общалка :) / Кристина Ивлеева

  • Как внести числа в сгенерированный массив чисел СЛУЧМЕЖДУ — 2019-04-25 11:15:30 (0)

    Visual Basic / wanx

  • рабочее зеркало гидры — 2019-04-22 13:27:49 (1)

    Операционные системы / Tony_Montana

  • гидра анонимный — 2019-04-21 15:37:08 (0)

    Низкоуровневое программирование / Tony_Montana

  • гидра браузер — 2019-04-21 11:49:42 (0)

    Компьютерная безопасность / Tony_Montana

  • Закрытие главной формы из другой. — 2019-04-19 09:08:27 (1)

    Borland C++ Builder / Lazy_Man

  • гидра оф сайт — 2019-04-18 13:15:50 (0)

    Студентам / Tony_Montana

  • Информация про криптовалюту. — 2019-04-18 04:38:31 (6)

    Общалка :) / PotapShavanov

  • ссылка на гидру зеркало — 2019-04-17 11:53:53 (0)

    Базы данных / Tony_Montana

  • гидра сайт доверенных — 2019-04-16 13:58:20 (0)

    Фриланс / Tony_Montana

  • Delphi Trichview замена текста — 2019-04-16 13:02:35 (0)

    Delphi & Kylix / ale-sumkin

  • Реально ли заработать на ставках? — 2019-04-16 07:34:02 (5)

    Общалка :) / Polernik

Показать новые сообщения »

Почтовая рассылка

Подписаться

Отписаться

Подписчиков: -1
Последний выпуск: 19.06.2015

C/C++/C# — общие вопросыc#

1спам

445

18 июля 2013 года

Charley

176 / / 16.08.2011

Есть C# Studio 2010 и MSQL Server 2008. При копировании таблицы на форму получаю ошибку
Как я установливал бд
как установить бд
Ошибка:

Подписаться на вопросНеобходима регистрация

По порядку

Сначала полезные

Сначала решения

1 ответ

0спам

1

18 июля 2013 года

kot_

7.3K / / 20.01.2000

платформа какая? и почему бы не написать ошибку — сидеть выглядывать ее на не увеличивающемся скрине — сомнительное удовольствие.

Цитировать

#tsql #sql-server-2017 #seq

#tsql #sql-server-2017 #seq

Вопрос:

Код кажется правильным, но выдает неверный вывод, пожалуйста, поправьте меня, если я делаю что-то не так

Это таблица «loadData»

Sequencement_CD ID Current_Year Record_DT Статус
18AA 109754BY6 2018 2018-01-01 U
19AA 222367DY7 2019 2019-02-22 A
19AB 222367DY7 2019 2020-05-26 A
NULL 222367DY7 2019 2020-06-06 A
NULL 222367DY7 2021 2020-06-06 A
NULL 29276KAR2 2021 2020-06-01 A
NULL 29276KAR2 2021 2020-07-06 A

Мне нужно сгенерировать ‘Sequence_Code’ только для тех идентификаторов, статус которых равен ‘A’

Алфавитный ‘Sequence_Code’ представляет собой комбинацию последних двух цифр ‘Current_Year’ и 2-символьного алфавита, такого как AA, AB,AC….AZ,

BA, BB,BC…BZ . CA, CB, CC….

Приведенная ниже функция дает мне следующий код последовательности:

  Create FUNCTION [dbo].[GetNextSequenceCode_TEST] (@LastSeqAlphabet varchar(100))
  RETURNS varchar(100)
   AS
    BEGIN 
         DECLARE @fPart varchar(100), @lChar CHAR(1);  
                  IF(@LastSeqAlphabet IS NULL OR @LastSeqAlphabet = '')   
                   RETURN 'AA';      

                     SELECT @fPart = LEFT(@LastSeqAlphabet, LEN(@LastSeqAlphabet) - 1);  
                     SELECT @lChar = RIGHT(@LastSeqAlphabet, 1);   
                       
                  IF(@lChar = 'Z')  
                  RETURN (SELECT [dbo].[GetNextSequenceCode_TEST](@fPart))   'A';  
                   
              RETURN @fPart   CHAR(ASCII(@lChar) 1);  
       END 
 

Таблица имеет повторяющийся идентификатор, каждая строка содержит разные данные (например, ‘Record_DT’).

Sequence_CD должен быть сгенерирован на основе идентификатора и текущего года.

Правила:

  1. Если уже идентификатор имеет Sequence_CD , то для следующей записи, имеющей тот же идентификатор и Tax_year , код должен принимать наибольшее значение Sequence_CD (существующее для того же идентификатора и текущего года), и он должен увеличить его на 1 для следующей строки. и обновите его в таблице.
  2. Если идентификатор не имеет Sequence_CD, то он должен сгенерировать его из ‘AA’, т.е. текущего года (с учетом только последних 2 цифр) ‘AA’
  3. ЕСЛИ идентификатор присутствует для другого Current_Year, здесь также Sequence_CD должен быть похож на currentYear (учитывая только последние 2 цифры) ‘AA’

Для каждой записи мне нужно следовать приведенному выше правилу, я делаю это с помощью курсора

     DECLARE @ID Varchar(9);
    DECLARE @Current_Year Varchar(4);
    DECLARE @Record_DT date;
    DECLARE @Seq_CD VARCHAR(4); 
    DECLARE @GeneratedSeq_CD varchar(20);   
    DECLARE @InsertedRecordsCursor as CURSOR;
    --DECLARE @FileName VARCHAR(500);
    
    BEGIN
        SET @InsertedRecordsCursor = CURSOR FOR
            select ID,Current_Year,Record_DT from TestTable              
            where  Sequencement_CD IS NULL AND  Status ='A' 

                OPEN @InsertedRecordsCursor; 
                                    
                    FETCH NEXT FROM @InsertedRecordsCursor INTO @ID,@Current_Year,@Record_DT
                    WHILE @@FETCH_STATUS = 0
                        BEGIN
                        
                        Select top 1 @Seq_CD = Substring(Sequencement_CD,3,2) from TestTable 
                        where Current_Year = @Current_Year And ID = @ID
                        AND Sequencement_CD IS NOT NULL  
                        ORDER BY Sequencement_CD desc

                        IF(@Seq_CD IS NULL OR @Seq_CD = '')   
                        Set @Seq_CD = ''; 
                                    
                            UPDATE TestTable   
                            SET Sequencement_CD = (RIGHT(@Current_Year,2))   dbo.GetNextSequenceCode_TEST (RTRIM(@Seq_CD))       
                            WHERE ID = @ID And Current_Year = @Current_Year 
                            And Record_DT = @Record_DT  
                                                            
                        FETCH NEXT FROM @InsertedRecordsCursor INTO @ID,@Current_Year,@Record_DT

                        END; 
                    
                CLOSE @InsertedRecordsCursor ;
                DEALLOCATE @InsertedRecordsCursor;
    END;
 

Ожидаемый результат:

Sequencement_CD ID Current_Year Record_DT Статус
18AA 109754BY6 2018 2018-01-01 U
19AA 222367DY7 2019 2019-02-22 A
19AB 222367DY7 2019 2020-05-26 A
19AC 222367DY7 2019 2020-06-06 A
21AA 222367DY7 2021 2020-06-06 A
21AA 29276KAR2 2021 2020-06-01 A
21AB 29276KAR2 2021 2020-07-06 A

Комментарии:

1. Вам действительно нужно CURSOR здесь? SQL — это язык, основанный на наборе, а a CURSOR — противоположность этому. Здесь также есть рекурсивная многострочная скалярная функция, которая также будет довольно плохой.

2. @Larnu да, мне нужно следовать этому подходу.. Пожалуйста, предложите, есть ли какая-либо другая альтернатива, если вы реализовали то же условие, используя другой подход, я хотел бы знать 🙂

3. @Larnu Я считаю, что этот подход будет работать, так как я получаю неверный вывод.. Этот код нуждается в небольшом исправлении, которое я ищу. был бы очень признателен, если бы вы предложили мне что-нибудь, если вы обнаружите, что здесь что-то не так.

4. мне кажется, что вы предусмотрели это в C # и перевели его в sql с помощью курсора и рекурсивной функции с таблицей автоматического обновления при удержании с блокировкой курсора! Я не удивлен, что это не дает вам результатов. концепция дыры может быть в порядке в C #, но так неправильно в SQL. Подумайте о наборе отверстий, а не просто построчно. почему бы не попробовать функцию ранжирования RANK() с целочисленным делением на 26 для первой буквы и по модулю 26 для второй буквы [Letter1] = CHAR(ASCII(‘A’) (RANK()over(order by dt)-1)/ 26), [Letter2] = CHAR(ASCII(‘A’) (RANK() over(порядок по dt) -1)&)

  • Ошибка при вычислении 7 букв
  • Ошибка при выставлении счета
  • Ошибка при выработке эцп передана неверная команда
  • Ошибка при выработке эцп неверный pin код
  • Ошибка при выпуске пушкинской карты