Использование backspace - CHR (8) - в запросе доступа - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть база данных управления доступом MS Access. Одно из полей используется редко - в нем хранится информация о том, является ли деталь в инвентаре редким вариантом более общей детали. Обычно поле используется в качестве суффикса к первичному номеру детали, и база данных генерирует его в отчетах при сохранении родительской детали в базе данных. (Одна первичная база данных, которая управляет номерами деталей, не содержит никакой информации о вариантах, но важно хранить ее, потому что база данных витрины имеет.)

В некоторых случаях я обнаружил, что вариант not просто суффикс. В некоторых случаях правильный вариант номер детали исключает символ из родительской части. Например, часть "3069b" имеет вариант "3069bpb198". Но я обнаружил, что часть «30361 c» имеет вариант «30361pb016», в котором исключено «c».

Мое предпочтительное решение состоит в том, чтобы закодировать символ возврата в поле для тех вариантов, которым он требуется. Затем, когда я объединяю родительский номер детали с номером варианта, «30361 c» & «\ bpb016» становится «30361pb016». Однако вывод, который я получаю в своем запросе Access, - «30361c □ pb016».

Формулы конкатенации в запросе, который я пробовал:

PartNum: [pl].[PartID] & [variant]  'returns "30361c\bpb016"
PartNum: Replace([pl].[PartID] & [variant],"\b",Chr(8))

Это то, что я пытаюсь сделать возможно? И если да, что я делаю не так?

Я бы действительно хотел избежать изменения базы данных, чтобы вариант содержал полный номер детали вместо суффикса.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Как насчет:

PartNum: left([pl].[PartID],len([pl].[PartID])-1) & [variant]
0 голосов
/ 09 апреля 2020

Ну, вы можете объединить возврат, но как и если это повлияет на отображение данных, это ОЧЕНЬ другая проблема. Использование ctrl-H восходит к временам зеленых экранов и даже к эпохе телетайпа. Другими словами, вам нужен способ необязательного удаления символа, а использование ctrl-H с современными GUI и системами, которые на самом деле не представляют пары символов ASCII, означает, что вопрос не в том, как заставить ctrl-H работать для рубить персонажа, но как можно отрубить персонажа на основе какой-то информации.

Другими словами, ctr-H - это сумасшедший подход, если только вы не используете зеленый экран ASCII или не скажете принтер.

Я также не стал бы вводить непечатаемый символ в эти данные, так как вы Вы не можете вводить эту информацию в поле, и, что еще хуже, вы не можете искать, сортировать и обрабатывать этот столбец как данные.

Становится еще хуже. Ваше бизнес-правило заключается в том, что «некоторые» данные в одном столбце должны влиять на отображение другого столбца !!!! Это настолько сильно нарушает реляционную модель данных, что это даже не смешно.

Вам нужно добавить битовый столбец (true / false). На самом деле, на самом деле, то, что должно произойти, - это выбор первого столбца, который должен учитывать 2-й столбец, и здесь должен был быть сделан РАЗЛИЧНЫЙ выбор.

Теперь этот трюк / идея мог бы сработать 25 лет go когда большинство компьютеров работали с ASCII, работали с зелеными экранами и выводили на экран / терминал или даже на сумасшествие телетайп? Ну, тогда Ctrl-H будет работать.

Современные системы отображают данные в графическом формате, и на самом деле данные больше не являются ASCII - они сохраняются в уни-коде. (что позволяет отображать данные практически на любом языке или в любом регионе).

Теперь, если предположить, что люди, получившие серьезное повреждение головного мозга, могут подумать о загрязнении данных таким образом?

Ну, вы можете использовать эта функция:

Public Function vScrub(ByVal s As Variant) As String

  Dim c    As Integer

  If IsNull(s) Then
     vScrub = ""
     Exit Function
  Else
     c = InStr(s, Chr(8))
     Do While c <> 0
        s = Left(s, c - 2) & Mid(s, c + 1)
        c = InStr(s, Chr(8))
     Loop
  End If

  vScrub = s

End Function

Итак, поместите вышеупомянутое в стандартный модуль кода (не модуль класса или модуль форм).

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

например:

vScrub([Col1] & [col2])

Редактировать:

Изменить подпрограмму для работы с несколькими chr (8) в строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...