Layer 7 class-map with different match types
Hello,
I am fighting with a problem on an ACE-4710 version A3(2.4) configuation. I just want to configure a layer 7 class-map that matches if one of two conditions is true. The problem is that these conditions are not from the same type and the ACE refuses the second match statement. However, in the configuration guide, it is clearly defined that it should be possible :
Here is what the configuration guides says :
host1/Admin(config)# class-map type http loadbalance match-any CLASS3
host1/Admin(config-cmap-http-lb)# 100 match http url .*.gif
host1/Admin(config-cmap-http-lb)# 200 match http header Host header-value XYZ
host1/Admin(config-cmap-http-lb)# exit
If I test exactly the same configuration in a context of my ACE, I receive an error message :
CH01AC03/P-104-A(config)# class-map type http loadbalance match-any CLASS3
CH01AC03/P-104-A(config-cmap-http-lb)# 100 match http url .*.gif
CH01AC03/P-104-A(config-cmap-http-lb)# 200 match http header Host header-value XYZ
Error: Match-any classmap can not have different type of match
If I use nested class-maps, I receive the same error message !
Is it a known problem or is it a solution for it ?
Thank you for any help
Yves
Hello Yves,
The command error is correct. I'll take a look at the docs and see about getting them corrected, if necessary.
Basically, for a match-all, you would have to use different types. For example, there will only be one Host header, so you would only specify it once using regex or a fixed string. As you found out, the match-any requires that they all be of the same type. See my example below:
class-map type http loadbalance match-all HEADER-AND-URL
100 match http url /login.*
200 match http header Host header-value "XYZ"
class-map type http loadbalance match-any URLS
100 match http url .*\.gif
200 match http url .*\.jpg
class-map type http loadbalance match-any HEADER
200 match http header Host header-value "CISCO"
policy-map type loadbalance first-match SLB_LOGIC
class HEADER-AND-URL
serverfarm LOGIN-FARM
class URLS
serverfarm IMAGES-FARM
class HEADER
serverfarm CISCO-FARM
class class-default
serverfarm WWW-FARM
So let's say you want to match requests for URLs ending in .jpg or for requests with Host header XYZ, and if it matches either one, then send to the same serverfarm.
class-map type http loadbalance match-any URL-JPG
2 match http url .*\.jpg
class-map type http loadbalance match-any HOST-XYZ
2 match http header Host header-value "XYZ"
policy-map type loadbalance first-match SLB_LOGIC
class URL-JPG
serverfarm SERVER-FARM
class HOST-XYZ
serverfarm SERVER-FARM
If you wanted to send these requests to the farm only if they matched BOTH matches, then you could do it as follows:
class-map type http loadbalance match-all HEADER-AND-URL
100 match http url /login.*
200 match http header Host header-value "XYZ"
policy-map type loadbalance first-match SLB_LOGIC
class HEADER-AND-URL
serverfarm LOGIN-FARM
Hope this helps,
Sean
Similar Messages
-
Path Finder in a 2D Grid Map With Different Terrain Types
I have been thinking for a while on path finding game algoritms and I can up with one idea witch I want to publish. The goal of my project is when I have a 2 dimensional grid map where squares can have different movement cost, like in Civilization II, to find the shortest way from one point in the map to another. I've used the Breathed First Search Engine. If you are not familiar to this search engine it is better to read about it first because I am not fcusing on it and I assume that you now how it works. You can read about it at the book "Practical Artificial Intelligence Programming in Java" writen by Mark Watson, witch is freely distributed at www.markwatson.com.
Actually the idea of this 2D grid path finder is to use a third dimension witch have a size equal to the highest movement cost among all terrain types. This helps solving the problem with the different movement cost of the squates. By adding this abstract third dimension it is posible to use the Breadth First Search Engine.
I this example the movementcost of a terrain type is always the same, no matter from witch square to with are you going (like in Civilization II but I haven't included roads or railroads). For example if you want to go from one square A to another square B with movement cost X (A and B are attached) you must go "up stairs" in the third dimension X - 1 times and then move to square B. But when you step on square B you are again at the lowest floor. So if you want to come back to the previous square A and it have movement cost Y first you must go floor Y and then jump in square A. And now you are again at the lowest floor at square A. When you move from one square to another you go always at the lowest floor. This is the way I handle with different movement costs.
When you find the path to the goal point it is in 3 dimensions. So you must just project it in the 2D map and that's all you have the shortest path.
I am sure this is not the best way to code this search engine but this is just the first scratch with no optimisation and so on. If I make a 100x100 randomly generated map it takes on my configuration(400Mhz Pentium II CPU with ASUS P2B MotherBoard on 100 MHz and 256 MB SD RAM on 133 MHz but because of my MB on 100MHz) around 1000 miliseconds (1000 miliseconds = 1 second) to find the shortest path from (1, 1) to (100, 100) witch is pretty good compare to the goTo function in Civilization II witch does not finds the shortest path at all and have made hundrets of gamers angry. This is amazing that nowadays there are so many games with bad path finding.
This project includes:
1. The PathFinder class witch does the jub.
2. The Map class witch has a generator for a random map in it.
3. The class TerrainType, every square on the map is based on this class.
4. The class TerrainTypes witch is the set of all terrain types used in the map.
5. The class PathFinderTest witch just test the path finder.
To test this project put all files in one directory and run PathFinderTest.java.
Map.java:
import java.util.Vector;
import java.util.Random;
//This class just creates a random map and keeps it. I will not comment on this.
class Map {
//here is kept the information about the terrain types placed in the map. Where
//every terrain type has a specific movement cost.
private int[][] terrain;
public TerrainTypes terrainTypes;
private int landMass;
private int width;
private int height;
private int highestMovementCost;
public Map(int aWidth, int aHeight) {
width = aWidth;
height = aHeight;
terrainTypes = new TerrainTypes();
highestMovementCost = terrainTypes.getHighestMovementCost();
terrain = new int[width][height];
landMass = 0;
generateRandomMap();
public void clearGoalAndStartLocFromWater(int sx, int sy, int gx, int gy) {
terrain[gx][gy] = 0;
terrain[sx][sy] = 0;
private void expandWater() {
int waterConstant = 40;
int waterExpansion = 2;
int[][] moreWater = new int[width][height];
Random randomizer = new Random();
for (int t = 0; waterExpansion > t; t++) {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (i + 1 >= 0 && j >= 0 && i + 1 < width && j < height) {
if (terrain[i + 1][j] != 4) {
if (randomizer.nextInt(waterConstant) == 0)
moreWater[i + 1][j] = 1;
if (i + 1 >= 0 && j - 1 >= 0 && i + 1 < width && j - 1 < height) {
if (terrain[i + 1][j - 1] != 4) {
if (randomizer.nextInt(waterConstant) == 0)
moreWater[i + 1][j - 1] = 1;
if (i >= 0 && j - 1 >= 0 && i < width && j - 1 < height) {
if (terrain[i][j - 1] != 4) {
if (randomizer.nextInt(waterConstant) == 0)
moreWater[i][j - 1] = 1;
if (i - 1 >= 0 && j - 1 >= 0 && i - 1 < width && j - 1 < height) {
if (terrain[i - 1][j - 1] != 4) {
if (randomizer.nextInt(waterConstant) == 0)
moreWater[i - 1][j - 1] = 1;
if (i - 1 >= 0 && j >= 0 && i - 1 < width && j < height) {
if (terrain[i - 1][j] != 4) {
if (randomizer.nextInt(waterConstant) == 0)
moreWater[i - 1][j] = 1;
if (i - 1 >= 0 && j + 1 >= 0 && i - 1 < width && j + 1 < height) {
if (terrain[i - 1][j + 1] != 4) {
if (randomizer.nextInt(waterConstant) == 0)
moreWater[i - 1][j + 1] = 1;
if (i >= 0 && j + 1 >= 0 && i < width && j + 1 < height) {
if (terrain[i][j + 1] != 4) {
if (randomizer.nextInt(waterConstant) == 0)
moreWater[i][j + 1] = 1;
if (i + 1 >= 0 && j + 1 >= 0 && i + 1 < width && j + 1 < height) {
if (terrain[i + 1][j + 1] != 4) {
if (randomizer.nextInt(waterConstant) == 0)
moreWater[i + 1][j + 1] = 1;
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (moreWater[i][j] == 1) {
terrain[i][j] = 4;
private void generateRandomMap() {
Random randomizer = new Random();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (randomizer.nextInt(3) == 1)
terrain[i][j] = 0;
else if (randomizer.nextInt(2) == 1)
terrain[i][j] = 1;
else if (randomizer.nextInt(2) == 1)
terrain[i][j] = 3;
else if (randomizer.nextInt(2) == 1)
terrain[i][j] = 2;
else if (randomizer.nextInt(2) == 1)
terrain[i][j] = 2;
else if (randomizer.nextInt(2) == 1)
terrain[i][j] = 1;
else if (randomizer.nextInt(2) == 1)
terrain[i][j] = 3;
else
terrain[i][j] = randomizer.nextInt(5);
expandWater();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (terrain[i][j] != 0)
landMass++;
public int getMapHeight() {
return height;
public int getMapWidth() {
return width;
public int getSquareID(int x, int y) {
return terrain[x][y];
public int getSquareMovementCost(int x, int y) {
return terrainTypes.getMovementCost(terrain[x][y]);
}PathFinder.java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Vector;
public class PathFinder {
private BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
//The array t3D[][] represents the 2D square map where t3D.leght = map width
//and t3D[x].lenght = map width (-1 < x < t3D.leght). The third dimension
//is refered to the square's movement cost, witch is definite by terrain.
//The fourth dimension will be with lenght = 3. When running the search engine
//(expanding the explored squares) this 3 values will keep the position of
//the previous square in 3 dimension, witch are width, height and the maximum
//movement cost among all squares.
private int[][][][] squares3DReference;
//Keeps information witch squares are visited.
private boolean[][][] visitedSquares;
private Map map;
//this is the queue used in the Breathed First Seatch.
private Vector queue3D;
//Here is saved the shortest path
private Vector path2D;
private int highestMovementCost;
public PathFinder(Map aMap) {
map = aMap;
queue3D = new Vector();
path2D = new Vector();
squares3DReference = new int[map.getMapWidth()][map.getMapHeight()][][];
visitedSquares = new boolean[map.getMapWidth()][map.getMapHeight()][];
highestMovementCost = map.terrainTypes.getHighestMovementCost();
buildAbstract3DTerrain();
private void buildAbstract3DTerrain() {
for (int x = 0; x < map.getMapWidth(); x++) {
for (int y = 0; y <map.getMapHeight(); y++) {
int movementCost = map.terrainTypes.getMovementCost(map.getSquareID(x, y));
if ( movementCost > 0) {
visitedSquares[x][y] = new boolean[highestMovementCost];
squares3DReference[x][y] = new int[highestMovementCost][3];
for (int z = 0; z < highestMovementCost; z++) {
for (int t = 0; t < 3; t++) {
squares3DReference[x][y][z][t] = -1;
private boolean isMoveValid(int x, int y, int z, int x2, int y2, int z2) {
if ( x < 0 || y < 0 || z < 0 || x2 < 0 || y2 < 0 || z2 < 0 || x >= map.getMapWidth() || y >= map.getMapHeight() || z >= highestMovementCost || x2 >= map.getMapWidth() || y2 >= map.getMapHeight() || z2 >= highestMovementCost)
return false;
if (map.terrainTypes.getMovementCost(map.getSquareID(x2, y2)) < 1)
return false;
if (visitedSquares[x2][y2][z2])
return false;
if (x == x2 && y == y2)
return true;
else {
if (z == map.terrainTypes.getMovementCost(map.getSquareID(x2, y2)) - 1)
return true;
else
return false;
private void clearPreviousSearchData() {
queue3D.clear();
path2D.clear();
for (int x = 0; x < map.getMapWidth(); x++) {
for (int y = 0; y < map.getMapHeight(); y++) {
if (squares3DReference[x][y] != null) {
for (int z = 0; z < highestMovementCost; z++) {
visitedSquares[x][y][z] = false;
for (int t = 0; t < 3; t++) {
squares3DReference[x][y][z][t] = -1;
private Vector copyPath2D() {
Vector path = new Vector();
for (int i = 0; i < path2D.size(); i++) {
path.add(path2D.get(i));
return path;
public Vector findPath(int sX, int sY, int gX, int gY) {
int head = 0;
int tail = 0;
int x = sX;
int y = sY;
int z = 0;
visitedSquares[x][y][z] = true;
mainLoop: {
while (tail <= head) {
int[][] moves = getPosibleMoves(x, y, z);
for (int i = 0; i < 9; i++) {
if (moves[i] != null) {
squares3DReference[moves[0]][moves[i][1]][moves[i][2]][0] = x;
squares3DReference[moves[i][0]][moves[i][1]][moves[i][2]][1] = y;
squares3DReference[moves[i][0]][moves[i][1]][moves[i][2]][2] = z;
queue3D.add(moves[i]);
if (moves[i][0] == gX && moves[i][1] == gY) {
break mainLoop;
visitedSquares[moves[i][0]][moves[i][1]][moves[i][2]] = true;
head++;
if (queue3D.size() == 0 || queue3D.size() == tail)
break mainLoop;
int[] nextInQueue = ((int[]) queue3D.get(tail));
x = nextInQueue[0];
y = nextInQueue[1];
z = nextInQueue[2];
tail++;
if (squares3DReference[gX][gY][0][0] == -1) {
clearPreviousSearchData();
return path2D;
fillpath2D(sX, sY, gX, gY);
Vector path = copyPath2D();
clearPreviousSearchData();
return path;
private int[][] getPosibleMoves(int x, int y, int z) {
int[][] moves = new int[9][3];
if (isMoveValid(x, y, z, x + 1, y, 0)) {
moves[0][0] = x + 1;
moves[0][1] = y;
moves[0][2] = 0;
else
moves[0] = null;
if (isMoveValid(x, y, z, x + 1, y - 1, 0)) {
moves[1][0] = x + 1;
moves[1][1] = y - 1;
moves[1][2] = 0;
else
moves[1] = null;
if (isMoveValid(x, y, z, x, y - 1, 0)) {
moves[2][0] = x;
moves[2][1] = y - 1;
moves[2][2] = 0;
else
moves[2] = null;
if (isMoveValid(x, y, z, x - 1, y - 1, 0)) {
moves[3][0] = x - 1;
moves[3][1] = y - 1;
moves[3][2] = 0;
else
moves[3] = null;
if (isMoveValid(x, y, z, x - 1, y, 0)) {
moves[4][0] = x - 1;
moves[4][1] = y;
moves[4][2] = 0;
else
moves[4] = null;
if (isMoveValid(x, y, z, x - 1, y + 1, 0)) {
moves[5][0] = x - 1;
moves[5][1] = y + 1;
moves[5][2] = 0;
else
moves[5] = null;
if (isMoveValid(x, y, z, x, y + 1, 0)) {
moves[6][0] = x;
moves[6][1] = y + 1;
moves[6][2] = 0;
else
moves[6] = null;
if (isMoveValid(x, y, z, x + 1, y + 1, 0)) {
moves[7][0] = x + 1;
moves[7][1] = y + 1;
moves[7][2] = 0;
else
moves[7] = null;
if (isMoveValid(x, y, z, x, y, z + 1)) {
moves[8][0] = x;
moves[8][1] = y;
moves[8][2] = z + 1;
else
moves[8] = null;
return moves;
private void fillpath2D(int sX, int sY, int gX, int gY) {
int[] gLoc = {gX, gY};
path2D.add(gLoc);
int x = gX;
int y = gY;
int z = 0;
while (x != sX || y != sY) {
int x2 = squares3DReference[x][y][z][0];
int y2 = squares3DReference[x][y][z][1];
int z2 = squares3DReference[x][y][z][2];
x = x2;
y = y2;
z = z2;
if (z == 0) {
int[] loc = {x, y};
path2D.insertElementAt(loc, 0);
PathFinderTest.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Vector;
public class PathFinderTest {
static BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
static Map map;
static int startX;
static int startY;
static int goalX;
static int goalY;
public static void main(String[] args) throws Exception {
System.out.print("Enter map size.\nx = ");
int width = Integer.parseInt(consoleReader.readLine());
System.out.print("y = ");
int height = Integer.parseInt(consoleReader.readLine());
System.out.print("Enter strting location.\nx = ");
startX = Integer.parseInt(consoleReader.readLine()) - 1;
System.out.print("y = ");
startY = Integer.parseInt(consoleReader.readLine()) - 1;
System.out.print("Enter goal location.\nx = ");
goalX = Integer.parseInt(consoleReader.readLine()) - 1;
System.out.print("y = ");
goalY = Integer.parseInt(consoleReader.readLine()) - 1;
if (goalX < 0 || goalY < 0 || startX < 0 || startY < 0 || goalX >= width || goalY >= height || startX >= width || startY >= height) {
System.out.println("Invalid parameters found. Program will exit");
System.exit(0);
map = new Map(width, height);
map.clearGoalAndStartLocFromWater(startX, startY, goalX, goalY);
printSolution(new Vector());
PathFinder pathFinder = new PathFinder(map);
long before = System.currentTimeMillis();
Vector path = pathFinder.findPath(startX, startY, goalX, goalY);
long after = System.currentTimeMillis();
long time = after - before;
printSolution(path);
if (path.size() == 0)
System.out.println("No path found.");
else
System.out.println("Path found.");
System.out.println("Finding the path took " + time + " milliseconds");
static void printSolution(Vector path) {
boolean[][] pathOnMap = new boolean[map.getMapWidth()][map.getMapHeight()];
for (int i = 0; path.size() > i; i++) {
int[] move = (int[]) path.get(i);
pathOnMap[move[0]][move[1]] = true;
for (int y = 0; y < map.getMapHeight(); y++) {
for (int x = 0; x < map.getMapWidth(); x++) {
System.out.print(" ");
if (pathOnMap[x][y] == false)
System.out.print(" ");
else
System.out.print("0");
if (x == startX && y == startY)
System.out.print("S");
else if (x == goalX && y == goalY)
System.out.print("G");
else
System.out.print(map.terrainTypes.getNameFirstLetter(map.getSquareID(x, y)));
System.out.println();
System.out.println();
}TerrainType.java:
public class TerrainType {
private int movementCost;
private String name;
TerrainType(int aMovementCost, String aName) {
movementCost = aMovementCost;
name = aName;
public int getMovementCost() {
return movementCost;
public String getName() {
return name;
public String getNameFirstLetter() {
return name.substring(0, 1).toUpperCase();
}TerrainTypes.java:
import java.util.Vector;
public class TerrainTypes {
//Here are saved the terrain types with the map has. ElementAt 'i' in
//setOfTypes is represented by the number in Map.terrain[x][y] witch is
//equal to i, were x, y are random integer as soon as they do not
//throw ArrayIndexOutOfBoundsException. Actually this is a coding to know
//a specific square in the map to witch terrain type is refered in setOfTypes.
private Vector setOfTypes;
public TerrainTypes() {
setOfTypes = new Vector();
setOfTypes.add(new TerrainType(1, "Plains"));
setOfTypes.add(new TerrainType(2, "Forst"));
setOfTypes.add(new TerrainType(3, "Jungle"));
setOfTypes.add(new TerrainType(4, "Mountain"));
setOfTypes.add(new TerrainType(-1, "X"));
public int getMovementCost(int i) {
return ((TerrainType) setOfTypes.get(i)).getMovementCost();
public String getName(int i) {
return ((TerrainType) setOfTypes.get(i)).getName();
public String getNameFirstLetter(int i) {
return ((TerrainType) setOfTypes.get(i)).getNameFirstLetter();
public int getHighestMovementCost() {
int max = 1;
for (int i = 0; setOfTypes.size() > i; i++) {
int movementCost = ((TerrainType) setOfTypes.get(i)).getMovementCost();
if ( movementCost > 0) {
if (max < movementCost)
max = movementCost;
return max;
}I hope this program will be helpful.
SogartarWhy is such a smart guy like you not using A*
It is a general known algorithm which will find the
optimal solution in a finite search-space (within a minimal time).
The calculation time for the A* algorithm is influenced by two parameters:
1 - cumulative cost
2 - minimal expected additional cost
The calculation of these two costs has a great influence on the
solution.
I think the actual problems most games experience with shortest path calculatoin are
1 - very little time to spent calculating the shortest path
The quickest solution might be the best for the game
If your solution takes 1 second for the calculation of a path for one element on the board (100x100)
What would it take for the game to calculate the path for all elements controlled by the computer ??
If the computer controls two players which each have 50 elements to control, it would take forever...
Don't even consider the usage of a larger board (200x200 would take 4 seconds/element when
algorithm has complexity O(n))
2 - low priority.
Users tend to forgive a bad shortest path-algorithm most of the time,
but not a bad display, bad pictures,...
This is why most shortest-path algorithms within games were
developed as a depth first search,
within some earlier games this was even developed as
a rule which went straight to the endlocation and
takes a right/left turn when blocked by water/wall/...
So the actual steps you should take are:
1 - develop a normal breath-first search (to get going)
2 - develop a normal depth-first search (to compare speed and solution with)
3 - develop a normal dijkstra algorithm (sometimes called A)
4 - develop a best first algorithm (called A*)
5 - develop other AI-algorithms building upon A* (tabu-search, limited memory A*,...)
6 - develop some other AI-algorithms (Genetic Algorithms, Simulated Annealing,...)
7 - compare and tweak/change all search-algorithms for
7 - a - size of maps (small versus huge)
7 - b - optimality of the solution
7 - c - actual usage for your game
8 - !!! very important !!!
Share the developed path algorithms along with remarks about speed, map-size,...
with the rest of us. I would be very interested in such library.
kind regards, -
One to Many Mapping with different SQL types
We have an interesting one to many relationship in our system in which the source and target field SQL types do not match, but the values do. The relationship is actually between multiple entries in the same database table. So, imagine we have some table that looks sort of like this:
KEY ObjectID OwnerNo
100 1234 0
101 ABCD 1234
102 EFGH 1234ObjectID is defined as a varchar type, but Parent entries are guaranteed to have integer value ObjectIDs. Child entries point to the parent through the OwnerNo field, which defined in the database as a numeric.
A simple one-to-many mapping will give you the following SQL error on execution: [SQL0401] Comparison operator = operands not compatible.
I tried modifying my descriptor after load as follows:
public static void modifyOneToMany(Descriptor descriptor)
ExpressionBuilder builder = new ExpressionBuilder();
Expression exp = builder.getField("OwnerNo").
equal(builder.getField("ObjectID").toNumber());
descriptor.getMappingForAttributeName("children")
.setSelectionCriteria(exp);
}But this introduces two problems in the generated SQL ( ... WHERE ((t0.OwnerNo = TO_NUMBER(t0.ObjectID) ... ). First, this generates a where clause using the function TO_NUMBER, which is not supported by DB2 on AS400, our database platform. Second, the table reference is off in the generated SQL--I couldn't find a way to specify that the right hand side of the = operator should be from the parent of the one to many mapping--both sides are referenced from the child context (t0).I found the getFunction() method on Expression, so I can solve half of this problem with the following code:
public static void modifyOneToMany(Descriptor descriptor)
if (descriptor.getMappingForAttributeName("children").isOneToManyMapping())
OneToManyMapping map = (OneToManyMapping) descriptor.
getMappingForAttributeName("children");
DatabaseField objectID= (DatabaseField) map.getSourceKeyFields().get(0);
DatabaseField ownerNo = (DatabaseField) map.getTargetForeignKeyFields().get(0);
ExpressionBuilder builder = new ExpressionBuilder();
Expression exp = builder.getField(ownerNo).getFunction("CHAR").
equal(builder.getField(objectID));
map.setSelectionCriteria(exp);
}This generates the following where clause:
... WHERE ((CHAR(t0.OwnerNo) = t0.ObjectID) ...
But, I still have two questions:
1. How do we get the right hand side of this comparison to reference the Parent part of the 1-M mapping?
2. Since character and numeric conversions are pretty standard SQL functions, is there something wrong with the DB2 database platform I'm using? -
ZBF Class-map and different way of doing them
Hi People just though i would ask a question on how to set up a ZBF. (question at the end of example config's)
i have been playing with this for a while now and like to get advice over what way is the recomended way of doing multiple matchs
ok we we all know the basic
class-map type inspect match-any ZBF_CM_ICMP
match protocol icmp
policy-map type inspect ZBF_PM_EXTERNAL->DMZ
class type inspect ZBF_CM_ICMP
inspect
and then the ZP dont need to show, this is a simple map using nbar fair enough
then we could a mulitiple matches
class-map type inspect match-any ZBF_CM_STD_DMZ_PORTS
match protocol icmp
match protocol http
match protocol dns
match protocol https
policy-map type inspect ZBF_PM_DMZ->EXTERNAL
class type inspect ZBF_CM_STD_DMZ_PORTS
inspect
Ok still easy to understand but now come the bit that a little more copmplex non NBAR matches
ip access-list extended AL_RDP_PORT
permit tcp any any eq 3389
class-map type inspect match-all ZBF_CM_RDP
match access-group name AL_RDP_PORT
policy-map type inspect ZBF_PM_EXTERNAL->DMZ
class type inspect ZBF_CM_RDP
inspect
This config is now using an access list because NBAR dosent have the protocol in it then map the AL to the CM then CM to PM. next is example is what i setup to get more non NBAR ports and only for 1 host
ip access-list extended AL_HOST_IP_IN
permit ip any host 11.11.11.11
ip access-list extended AL_ISATAP
permit 41 any any
ip access-list extended AL_TEREDO
permit udp any any eq 3544
class-map type inspect match-ANY ZBF_CM_DirectAccess_Protocols
description Nested Class Map
match access-group name AL_ISATAP
match access-group name AL_TEREDO
match protocol https
class-map type inspect match-ALL ZBF_CM_APP_IN
match access-group name AL_HOST_IP_IN
match access-group name ZBF_CM_DirectAccess_Protocols
policy-map type inspect ZBF_PM_EXTERNAL->DMZ
class type inspect ZBF_CM_APP_IN
inspect (or pass with rule for other direction)
THis is what i setup and it works not for this example but the rule flow i then was having issues with DMVPN and ZBF (turned out to be an iso bug annoying me) but i used CiscoCP to setup the ZBF automaticly forthe DMVPN and it ZBF rule where same proceduare as below.
ip access-list extended AL_HOST_IP_IN
permit ip any host 11.11.11.11
ip access-list extended AL_ISATAP
permit 41 any any
ip access-list extended AL_TEREDO
permit udp any any eq 3544
class-map type inspect match-ANY CM_ISATAP
match access-group name AL_ISATAP
class-map type inspect match-ANY CM_TEREDO
match access-group name AL_TEREDO
class-map type inspect match-ANY ZBF_CM_DirectAccess_Protocols
description Nested Class Map
match class-map CM_ISATAP
match class-map CM_TEREDO
match protocol https
class-map type inspect match-ALL ZBF_CM_APP_IN
match access-group name AL_HOST_IP_IN
match access-group name ZBF_CM_DirectAccess_Protocols
policy-map type inspect ZBF_PM_EXTERNAL->DMZ
class type inspect ZBF_CM_APP_IN
inspect
So what Cisco CP did was make yet another level of nesting rather then the match-all class map having the match access list command then made a cm with access list then the main class map had only other match class maps in it..
QUESTION:
Why did CiscoCP do the extra nesting
both ways worked but i would like to know why the cisco CP did the same thing with the other layer of CM did it do this for best practise or dose this make changed later easier i cant understand whats the advange to doing it this way... but if there is a valid reason then ill great jjust trying to understand.
thanks
regards
A very sore headed
DaveWhen people say "use as few classes as possible", it's usually related not to optimize heap usage, but jar size.
But it's true that some smart use of OOP can save a lot of memory during runtime (and even jar size in some cases). Using an interface in my GUI library helps make the architecture a lot simpler and more compact, to the point that even if all the GUI widgets are being used (so the "just loading the code you need at the moment" argument is moot) memory use is still smaller because I need a lot less hacks to glue everything together.
It still is worth noting that often memory fragmentation is the true cause of running-out-of-memory-errors, and in this case loading many small classes will achieve exactly the opposite.
shmoove -
Posting of cross company transaction with different doc types
Hi,
The scenario is:-
We have two companies X and Y.
X makes a payment to Y with the following FI entries:-
Company Code X
Dr Vendor Y
Cr Bank HDFC
Company Code Y
Dr Bank ICICI
Cr Customer X
Now this needs to be a cross company transaction where the doc type for CC X should be vendor Payment 'KZ' while the doc type for CC Y should be a customer reciept with doc type 'DZ'.
Although I am able to map the accounts in cross company code config I am not able to split the transaction of different company codes with different document types.
Is there any way we can do this in standard SAP?
Thanks in advance,
NitishHi
As per your issue ...There are no possibilities to post in sap with different document types.
If you want you can post cross company code transactions with one document types
Regards
vamsi -
Vendor Payment with different document types
Dear Sapguru,
We have a scenario where a particular vendor payable is in two different document types for example, RE and KZ.
When we execute TC F110, the payment proposal is grouping the payments by document type. I.e. it grouped all the documents under type RE and grouped all the documents under type KZ and created two line items in the payment proposal.
Actually, we want to have a single group consisting of all the document types payable to the vendor.
We have checked different SAP notes and also verified out system settings, but the problem still remains.
Can somebody let us know how to group all the open items in a single line item in F110 irrespective of document types.
Thanks in Advance.
Regards.,
RamaDear Naravi,
the main factor which affects the grouping of items is the Structure ZHLG1:
ZBUKR
ABSBU
LIFNR
KUNNR
EMPFG
WAERS
ZLSCH
HBKID
HKTID
BVTYP
SRTGB
SRTBP
XINVE
PAYGR
UZAWE
DTWS1
DTWS2
DTWS3
DTWS4
KIDNO
All these fields have to coincide, to have a single payment.
Please check why two documents with different document type are paid into two different payments.
Read the SAP notes 109233 and 164835 and 305414 as well.
I hope this helps.
Mauri -
Reading fixed length file with different record types
Hi,
I need to read a fixed-length file with different record types, but the record identifier is in 31st position and not in 1st position.
But if I give 31 as position in File adpater wizard, BPEL takes whole 1-31 as identifier.
How we need to read such files.
Thanks
Ravdeephi ,
u cannot use the default wzard for this
use some thing like this nxsd:lookAhead="30" nxsd:lookFor="S"have a look at the below link it has some examples
http://download.oracle.com/docs/cd/B31017_01/integrate.1013/b28994/nfb.htm -
How to find what are the support-teams map with particular componant type
hi experts,
i am new in solution manager.. My requirement is when creating the support message in crmd_order t-code i have to give the componant type in transaction data after that in fast entry screen i have to assign support team for that componant type .. here i have to give only valid support team which are map with particular componant type .. when save the support message here i have to check that support team is map with that particular componant type (i.e that support team is belong to that componant type ) .. thats what i have to do in abap development .. so how to find the what are all the support teams mapped with particular componant type .. whether it is stored in any table or ?.. Please give solutions ..
Regards,
Kumar..Hi Kumaresan-
I'm not sure I fully understand your requirement but I will try to help out. If you are trying to determine / associate the relevant support team according to which component they are responsible for, this might help.
The determination of the support team is maintained by configuring rule 13200137 in transaction PFAC_RESPO.
Click on the Responsibilities Tab
Create your responsibility based on your support team requirements
Assign the appropriate Support Team, this data will be taken from the settings you have maintained when creating your org chart in ppoma_crm
Highlight a responsibility and click Change
In this table you will see an entry for SAP Component, this is where you identify which support team will be determined based on component -
BDC for MM with different material types.
Hi, Can anyone explain me how the MM01 tcode can be handled in BDC, when material with different material types are present in the flat file. Different material types have different views and hence different recordings....How to handle this scenario?
Based on different types of material, you can able to find out which all views are required to call through BDC. Try to find out views by using tables MARA, MAKT, MARD, MARC etc. Once it is confirmed you can call views using screen numbers.
Here I don't think so more than one recording is required. Record MM01 transaction using Basic Data1, once you go inside the transaction select all the views required to complete the MM01 transaction. It will record all the views (hence screen numbers), then you can switch/call views based on screen numbers.
Hope this helps you to resolve your query. -
Hello Gilles,
One question about something I was not able to find in the documentation.
Lets say I have one class-map which includes 2 ports (in this case https and 5061).
Can I associate this class-map to just 1 generic serverfarm and probe for both ports or I have to specify 2 serverfarms/rservers/probes?
So, by not specifying the ports on the rserver, if a request is received on port 443 (or 5061), it is sent to the same respective port on the rserver?
The same way is valid for the generic probe. ACE module is able to probe both ports based on the class-map?
Thanks and have a great day!!
Giulio.
probe tcp PROBE_GENERIC_TCP
description This probe works for all TCP services by inheriting the VIP port.
interval 15
faildetect 2
passdetect interval 15
passdetect count 2
open 2
rserver host SERVER1_ACCESS
ip address <1AC>
inservice
rserver host SERVER2_ACCESS
ip address <2AC>
inservice
serverfarm host ACCESS-SFARM
probe PROBE_GENERIC_TCP
rserver SERVER1_ACCESS
inservice
rserver SERVER2_ACCESS
inservice
class-map match-any OCS_L4ACCESS
2 match virtual-address x.x.x.176 tcp eq https
2 match virtual-address x.x.x.176 tcp eq 5061
policy-map type loadbalance first-match OCS_L4ACCESS
class class-default
sticky-serverfarm ACCESS_STICKY
policy-map multi-match POLICY
class OCS_L4ACCESS
loadbalance vip inservice
loadbalance policy OCS_L4ACCESS
loadbalance vip icmp-reply active
connection advanced-options OCS_VIPTIMEOUT
nat dynamic XXX vlan 503Even if you use the 4710 appliance or expect the inheritance in the module software, it's worth considering if this is really what you want. If you keep multiple ports in the L3/L4 class-map you can't handle the services independently. You will have a common serverfarm for both https and 5061. If https service stops on one rserver, the ACE will place that rserver (and not that service) in out-of-operation state and it won't receive any 5061 traffic either. (You have the fail-on-all probe option but I wouldn't say it's a better choice. In that case, https traffic would be sent to the rserver even if https port is closed as long as there is at least one working service on it.) That's why I prefer a separate class-map and separate serverfarm for each service. (They can contain the same rservers, no need to duplicate.) BUT if the software supports probe port inheritance, you can benefit from it even in this scenario: serverfarm-443 and serverfarm-5061 can both use your PROBE_GENERIC_TCP.
-
In the following class-map:
"class-map match-any voice
match access-group 190"
If the ACL 190 has more than one line with "permit" statements.
In order for the policy-map using the above class-map to find a match and use the rules applied for the above class-map, does the traffic need to meet all the criteria in the ACL or does it work like a regular ACL, where it "walks" down and it stops execution at the first permit/deny "hit"?
Regards,
Christosthe explicit " match-any" will do just that.So, a nested ACL can be configured for multiple criteria.
The alternate is a "match-all" where all nested options in your acl MUST be met. Hope this helps.
T -
IDOC - IDOC scenario with different message types
Dear Experts
I will like to have your expert opinion in the following question:
I have an IDOC -> IDOC scenario. Wherein at the destination system I have a message type which does not exist at the source system.
Also the IDOC type at destination system does not exist at the source system.
Let say, I will be creating custom message type at source system (Z****) and will also be creating the custom IDOC type (z****) with the same structure, definition as the destination.
Now my question is, even if there will be different message types and different IDOC types but with the same structure (the segment level definition
and field attribute remains the same at both the system). The difference lies with the names. And I have proper mapping though process code.
Will I be able to receive the IDOC correctly at destination?
Thanks & Best RegardsHi All
I figured out the answer myself now.
You got to have same name for message type. All of you said this and this is rite.
Coming to IDOC type, I did not really got clear idea on this from this discussion.
But after working on a scenario, I learnt that, you can have different names for IDOCs, but provided that, whichever IDOC type the source system is sending, the same type must exist in your destination as well. Otherwise, system wont process your IDOC. But from mapping point of view, its upto individual how do thay handle mapping inside inbound process code for different idoc types / strucutes.
Lesson learnt by me, ideally try to keep same name for both logical message and idoc type at both source and destination. If possible try to keep the structure level also the same. This is my view, learnt it the hard way.
Cheers
Shane -
Same functions with different return types in C++
Normally the following two functions would be considered the same:
int getdata ( char *s, int i )
long getdata ( char *s, int i )
Every other compiler we use would resolve both of these to the same function. In fact, it is not valid C++ code otherwise.
We include some 3rd party source in our build which sometimes messes with our typedefs causing this to happen. We have accounted for all of the function input types but never had a problem with the return types. I just installed Sun ONE Studio 8, Compiler Collection and it is generating two symbols in our libraries every time this occurs.
Is there a compiler flag I can use to stop it from doing this? I've got over 100 unresolved symbols and I'd rather not go and fix all of them if there is an easier way.Normally the following two functions would be
considered the same:
int getdata ( char *s, int i )
long getdata ( char *s, int i )Not at all. Types int and long are different types, even if they are implemented the same way.
Reference: C++ Standard, section 3.9.1 paragraph 10.
For example, you can define two functions
void foo(int);
void foo(long);
and they are distinct functions. The function that gets called depends on function overload resolution at the point of the call.
Overloaded functions must differ in the number or the type of at least one parameter. They cannot differ only in the return type. A program that declares or defines two functions that differ only in their return types is invalid and has undefined behavior. Reference: C++ Standard section 13.1, paragraph 2.
The usual way to implement overloaded functions is to encode the scope and the parameter types, and maybe the return type, and attach the encoding to the function name. This technique is known as "name mangling". The compiler generates the same mangled name for the declaration and definition of a given function, and different mangled names for different functions. The linker matches up the mangled names, and can tell you when no definition matches a reference.
Some compilers choose not to include the return type in the mangled name of a function. In that case, the declaration
int foo(char*);
will match the definition
long foo(char*) { ... }
But it will also match the definitions
myClass foo(char*) { ... }
double foo(char*) { ... }
You are unlikely to get good results from such a mismatch. For that reason, and because a pointer-to-function must encode the function return type, Sun C++ always encodes the function return type in the mangled name. (That is, we simplify things by not using different encodings for the same function type.)
If you built your code for a 64-bit platform, it would presumably link using your other compilers, but would fail in mysterious ways at run time. With the Sun compiler, you can't get into that mess.
To make your program valid, you will have to ensure your function declarations match their definitions. -
Same Input name with different data type cause the reflection exception
I have a proxy contains couple RFCs. Two RFCs contain an argument named IN_COMPANY_CODE with data type of ZTRE_FX_BUKRSTable. Another RFC contains the same argument name of IN_COMPANY_CODE but hold different data type (String). All RFCs are in the same proxy. Complie and build the application with no issue.
But when I ran the RFC, it generates the reflection exception below:
Method SAPProxy1.Z_F_Tre_R_Pre_Trade_Fx can not be reflected. --> There was an error reflecting 'In_Company_Code'. > The XML element named 'IN_5fCOMPANY_--5fCODE' from namespace '' references distinct types System.String and MSTRFOREX.ZTRE_FX_BUKRSTable. Use XML attributes to specify another XML name or namespace for the element or types.
I realize the conflict introduced by the same name with difference data type. But I would like to know if this is fixable as a bug or if there is any best practice and/or some manual intervention to make it work.Please install fix from OSS note 506603. After this, right-click .sapwsdl file and select "Run custom tool".
-
Delivery split with different delivery types
Hi,
Ive got the following problem with delivery split:
In my order (type ZTA) I have two items with two different item categories (for example TA1 and TA2). For these two items two different deliveries with two different delivery types (for example item TA1 in LF1 and TA2 in LF2) should be created. For this I implemented the needed copy control and in the customizing of the order type ZTA I maintained LF1 as a default delivery type. When I deliver the order manually via Transaction VL01N, I have no problem, because the system delivers first the item which can be delivered with delivery type LF1. Then I have to start VL01N again, predefine LF2 as delivery type and then the other item will be delivered with LF2. But this doesnt work in the Batch Collective Processing with VL04, VL10A or even VL10Batch. The system cant deliver the order. And in none of these mentioned transactions I have the possibility to predefine a delivery type. I tried also a routine in the copy control on item category level where I want to switch to a different delivery type in case of the second item category. But it didnt work. And I couldnt find any other appropriate exit how to influence the delivery type on base of the item category. What cant be changed is probably that I will always have to deliver this order two times because the system wont be able to split the order in one collective processing and create two deliveries at once. That wouldnt be a big problem if I could predefine the delivery type for the second collective processing in order to get the second item delivered.
Is there anybody who can help me?
Kind Regards
StephanHi,
thank you for your quick answer. That was a big help and I will do your suggested solution with the BDC.
But if I understand you correctly, you also didn't find a solution for this problem in the SAP Standard functions (without BDS)?
Kind regards
Stephan
Maybe you are looking for
-
PH2423 How do you get text pages in a project to a saved slideshow?
Hi Peeps, My project is a book which has photos AND text pages. I can get the photos to the saved slide show but not the text pages. Can someone advise?
-
I like to have some tabs open at the same time. Then I have some items in the toolbar that a sometimes need to open. I would like them to automatically open in a new tab without closing any tabs I already have open. Can this be done? I know if I righ
-
I re-send a mail with 3 pdf attachmets to an outlook account and the attachments do not arrive to the receiver, if the receiver is a Windows PC. If the receiver is an iPhone the attachments can be accessed til the moment Unload the full message is pu
-
HT4906 is photo stream on lion
ihave down loaded lion but dont know how to down my photos from the cloud using photo stream
-
Unknown error on mac app store
Cannot update or buy new apps on appstore - everytime have same error - any suggestions??